2011.6.14:
(1)单件模式总结:
【Singleton】 除了singleton以外,其他的设计模式都是为了软件的复用能够更简洁。
单件,保持一个全局的唯一访问点,一般用在一些资源的控制上,比如数据库连接等.采用他的好处,全局又只有一个访问点,控制与可维护性都好,同时还可以实现延迟加载
(2)生成器模式总结:
【Bulider】 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到.
为何使用?
是为了将构建复杂对象的过程和它的部件解耦.注意: 是解耦过程和部件.
因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开.
public interface Builder { //创建部件A 比如创建汽车车轮 } |
public class Director { private Builder builder; public Director( Builder builder ) { } } |
这句话是核心:
用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品:
Builder的具体实现ConcreteBuilder:
通过具体完成接口Builder来构建或装配产品的部件;
定义并明确它所要创建的是什么具体东西;
提供一个可以重新获取产品的接口:
public class ConcreteBuilder implements Builder { Part partA, partB, partC; } |
通俗讲解:Builder模式的理解
简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高), 于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!
就象国内好多企业上erp一样,上erp,首先得找软件公司呀,找到软件公司后,软件公司说,我只知道怎么写软件,就知道怎么实现,不清楚整个erp的流程。好,那我们还得找一个咨询公司,好,找到德勤了,德勤说好,我要软件怎么做,软件公司怎么做,我就能保证软件能为你们提供erp系统了。
此模式是为了让设计和施工解耦,互不干扰。
package builder;
public interface Builder
{
public void makeWindow();
public void makeFloor();
public Room getRoom();
}
/*************************************************************/
package builder;
public class Designer {
public Designer() {
}
public void order(Builder builder)
{
builder.makeWindow();
builder.makeFloor();
}
}
/*************************************************************/
package builder;
public class Mingong implements Builder{
private String window="";
private String floor="";
public Mingong() {
}
public void makeWindow(){
window=new String("window");
}
public void makeFloor(){
floor=new String("floor");
}
public Room getRoom()
{
if((!window.equals(""))&&(!floor.equals("")))
{
Room r = new Room();
r.setFloor(floor);
r.setWindow(window);
return r;
}
else return null;
}
}
/*************************************************************/
package builder;
public class Room {
private String window="";
private String floor="";
public Room() {
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
}
/*************************************************************/
package builder;
public class Client {
public Client() {
}
public static void main(String[] args) {
Builder mingong=new Mingong();
Designer designer=new Designer();
designer.order(mingong);
Room r = mingong.getRoom();
System.out.println(r.getWindow);//会输出window,表示构建成功。
}
}
(3)工厂模式Factory模式
这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:
Sample mysample=new MySample();
Sample hissample=new HisSample();
随着项目的深入,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.
但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.
工厂方法
你会建立一个专门生产Sample实例的工厂:
public class Factory{
public static Sample creator(int which){
//getClass 产生Sample 一般可使用动态类装载装入类。
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
那么在你的程序中,如果要实例化Sample时.就使用
Sample sampleA=Factory.creator(1);
这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.
使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample。
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory), 下面具体进行两种模式的复习