好菜每回味不同—建造者模式
《大话设计模式》中讲建造者模式(Builder Pattern)引用一个例子:麦当劳、肯德基的汉堡不管在哪家店里吃,什么时间时间去吃,至少在中国,味道基本都是一样。而那道“鱼香肉丝”几乎是所有大小中餐馆饭店都有的一道菜,但却可以吃出万种口味来,这是为什么呢?
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式(Builder Pattern)结构图
- Builder是为了创建一个Product对象的各个部件指定的抽象接口。
- ConcreteBuilder是具体建造者,实现Builder接口,构造和装配各个部件。
- Product是产品角色
- Director是指挥者,构建一个使用Builder接口的对象。
Product类——产品类,有多个部件组成。
public class Product{ IList<String> parts = new List<string>(); public void Add(String part){ parts.add(part); } public void Show(){ //产品创建 for(List list : parts){ //println list } } }
Builder类——抽象建造者类,确定产品有两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult。
public abstract class Builder{ public abstract void BuildPartA(); public abstract void BuildPartB(); public abstract Product GetResult(); }
ConcreteBuilder类——具体建造类
public class ConcreteBuilder1 extends Builder{ private Product product = new Product(); public void BuildPartA{ //部件A product.Add("附件A"); } public void BuildPartB{ //附件B product.Add("附件B"); } public Product GetResult(){ return product; } }
ConcreteBuilder2类——具体建造者类
public class ConcreteBuilder2 extends Builder{ private Product product = new Product(); public void BuildPartA{ //部件X product.Add("附件X"); } public void BuildPartB{ //附件Y product.Add("附件Y"); } public Product GetResult(){ return product; } }
Director类——指挥这类
public class Director{ public void Construct(Builder builder){ builder.BuildPartA(); builder.BuildPartB(); } }
Client类—客户端代码,客户不需知道具体的建造过程
public class Client{ public static void main(string args){ Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); director.Construct(b1); Product p1 = b1.GetResult(); p1.show(); director.Construct(b2); Product p2 = b2.GetResult(); p2.show(); } }
建造者模式是在创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
建造者模式适用范围
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。