设计模式--创建型(2)

来源:互联网 发布:钱咖试客类似的软件 编辑:程序博客网 时间:2024/04/28 20:27

四、Singleton(单例模式)
思想:在整个系统中,某类有且仅有一个实例。
代码:

public class Singleton{  //静态私有成员变量  private static Singleton instance=null;  private Singleton()  {  }  public static Singleton getInstance()  {    if(instance==null)     instance=new Singleton();    return instance;  }}

解析:
单例模式注意三点:
(1)单例类的构造函数设为private。
(2)提供一个自身的静态私有成员变量。
(3)提供一个公有的静态工厂方法。

构造函数的使用:
(1)new 一个类的实例。
(2)函数中通过this调用其他的构造方法。

当构造方法被private后:
(1)不能在程序中new一个新的实例。
(2)该类不能被继承,因为如果继承了,构造函数是private,则子类在实例化的时候不能实例化,所以继承一个构造函数private的类是不被允许的。
所以构造方法私有化,用private修饰,可以防止创建多个实例。

静态工厂方法:
设置为静态工厂方法,因为静态方法可以直接使用类名进行调用,所以当要得到一个单例类的实例时,可以直接 类名.getInstance(),返回类的实例。

私有静态变量:
如果单例类的成员变量不是static,则静态工厂方法是没有办法调用该私有变量的,所以成员变量必须为static。

五、Builder(建造者模式)
思想: 一个复杂对象的创建工作,通常由各个部分的子对象用一定的算法构成,由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法相对稳定。
例子: 有比亚迪和吉利两个车企,生产一辆汽车都需要轮子,发动机和底盘。虽然是两个不同的企业,但是一辆车子的结构相近。所以可以设计一种模式。将建造产品的过程分离出来,使用相同的创建过程创建不同的产品。
代码:

//汽车类public class Car  {  private String wheel; //轮子  private String engine; //发动机  private String underpan;//底盘  //下面为set和get方法  public String getWheel(){}  public void setWheel(String wheel){this.wheel=wheel;}  public String getEngine(){}  public void setEngine(String engine){this.engine=engine;}  public String getUnderpan(){}  public void setUnderpan(String underpan){this.underpan=underpan;}}//Builder抽象类public abstract Builder{  protected Car car=new Car();  //成员变量  public void buildWheel();  public void buildEngine();  public void buildUnderpan();  public Car getResult()  {    return car;  }}//具体的BYDBuilderpublic class BYDBuilder implements Builder{  public void buildWheel()  {    car.setWheel("BYD wheel");  }  public void buildEngine()  {    car.setEngine("BYD Engine");  }  public void buildUnderpan()  {   car.setUnderpan("BYD Underpan");  }}//具体的GeelyBuilderpublic class GeelyBuilder implements Builder{  public void buildWheel()  {    car.setWheel("Geely wheel");  }  public void buildEngine()  {    car.setEngine("Geely Engine");  }  public void buildUnderpan()  {   car.setUnderpan("Geely Underpan");  }}//Director类public class Director{  private Builder builder;  public Director(Builder builder)  {    this.builder=builder;  }  public Car construct()  {    builder.buildWheel();    builder.buildEngine();    builder.buildUnderpan();    return builder.getResult();  }}//生成一个BYD汽车Builder builder = new BYDBuilder();Director director = new Director(builder);Car car=director.construct();//生成一个geely汽车Builder builder = new GeelyBuilder();Director director = new Director(builder);Car car=director.construct();//生成两个不同的汽车,唯一的区别就在生成不同的builder。

优点:
将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。当增加新的产品时,只需要创建新的建造者类即可,易于系统的扩展。

0 0
原创粉丝点击