建造者模式/生成器模式
<设计模式其实很简单>笔记
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
//抽象的建造者类
public abstract class Builder{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
//具体的产品类
public class Product{
ArrayList<String> parts = new ArrayList<String>();
public void Add(String part){
parts.add(part);
}
public void Show(){
System.out.println("Create product");
for(int i = 0 ; i<parts.size() ; i++) System.out.println(parts.get(i));
}
}
//建造者类 1
public class ConcreteBuilderA extends Builder{
private Product product = new Product();
//覆盖父类方法
@Override
public void BuildPartA(){
product.Add("Part A");
}
@Override
public void BuildPartB(){
product.Add("Part B");
}
@Override
public void GetResult(){
return product;
}
}
//建造者类 2
public class ConcreteBuilderB extends Builder{
private Product product = new Product();
//覆盖父类方法
@Override
public void BuildPartA(){
product.Add("Part W");
}
@Override
public void BuildPartB(){
product.Add("Part Z");
}
@Override
public void GetResult(){
return product;
}
}
//指挥者类
public class Director{
public void Construct(Builder builder){
builder.BuildPartA();
builder.BuildPartB();
}
}
//客户端代码
public static void main(String[] args){
Director director = new Director();//指挥者
Builder builderA = new ConcreteBuilderA();//建造者
Builder builderB = new ConcreteBuilderB(); //建造者
//指挥者建造A
director.Construct(builderA);
Product productA = builderA.GetResult();
productA.Show();
//指挥者建造B
director.Construct(builderB);
Product productB = builderB.GetResult();
productA.Show();
}
解释
--指挥者:指挥创建对象的各种操作(需要先调用什么方法,然后再做什么操作,指挥者按部就班地指挥一个对象的创建) --> 负责复杂对象的构建过程
--建造者:根据不同的需求,构建不同的对象。 --> 创建不同的表示
③与工厂模式的比较
建造者模式和工厂模式都是创建型模式,目的都是得到一个对象。但侧重点不同。
工厂模式在于将对象的实例化延迟到子类中,而创建者模式则是保持一个对象创建过程的稳定性。
工厂模式专注于创造相同表象的对象,但当希望得到具有多种表象的实例时,使用建造者模式更佳
④优点:
--创建者隐藏产品的组装过程,用户只需指定要创建的类型就行。体现了依赖倒转原则,抽象不依
赖与细节,细节依赖于抽象。
--体现了多态(需要改变一个产品的内部表示,只需再定义一个建造者)。
--每一个具体建造者都是相对独立的。
--增加新的具体建造者不用修改原有类库的代码。 符合开放-封闭原则