建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示。
建造者模式将一个产品的内部表象和产品的生成过程分割开来,建造对象的时候只需要指定需要建造的类型,而不必了解具体的建造过程。
一个玩具工厂,工人们建造新的玩具人时,需要逐个安装各个部分,种类有胖虎和小夫。万一粗心大意忘记装了某个部分,就出现了不合格的玩具,缺胳膊少腿。
为了减少次品率,老板引入了一台机器,设定好程序后,工人只要选择制造的玩具种类,按下开关之后机器自动就去装配对应的玩具。
代码结构图如下:
用代码来表示就是====>>
首先是一个建造人物的接口(机器类,作为一个制造者,对玩具而言是个上帝般的角色,展示了装配一个玩具的各个过程):
package com.hy.bulider;
public class God {
private IPerson person;
public God(IPerson person) {
this.person = person;
}
public void createPerson() {
person.buildHead();
person.buildBody();
person.buildArms();
person.buildHands();
person.buildLegs();
person.buildFoots();
System.out.println("合成了一个"+person);
}
}
然后是玩具的接口类和两个具体的玩具实现类(机器程序设定的程序,规定了作为一个玩具必须要有的零件):
package com.hy.bulider;
public interface IPerson {
public void buildHead();
public void buildBody();
public void buildArms();
public void buildHands();
public void buildLegs();
public void buildFoots();
public String toString();
}
package com.hy.bulider;
public class Fatter implements IPerson{
public void buildHead() {
System.out.println("組成胖頭部");
}
public void buildBody() {
System.out.println("组成胖身体");
}
public void buildArms() {
System.out.println("组成胖胳膊");
}
public void buildHands() {
System.out.println("组成胖手");
}
public void buildLegs() {
System.out.println("组成胖腿");
}
public void buildFoots() {
System.out.println("组成胖脚");
}
@Override
public String toString() {
return "胖虎";
}
}
package com.hy.bulider;
public class Thinner implements IPerson{
public void buildHead() {
System.out.println("組成瘦頭部");
}
public void buildBody() {
System.out.println("组成瘦身体");
}
public void buildArms() {
System.out.println("组成瘦胳膊");
}
public void buildHands() {
System.out.println("组成瘦手");
}
public void buildLegs() {
System.out.println("组成瘦腿");
}
public void buildFoots() {
System.out.println("组成瘦脚");
}
public String toString() {
return "小夫";
}
}
最后是测试类:
package com.hy.bulider;
public class Test {
public static void main(String[] args) {
Thinner thinner = new Thinner();
God god = new God(thinner);
god.createPerson();
Fatter fatter = new Fatter();
god = new God(fatter);
god.createPerson();
}
}
这样工人工作的时候只需要选择特定的模型,然后运行机器就可以得到合格的玩具,而且不必关心装配玩具的具体细节。即使后面新增了大雄静香等需求订单,只需要在机器中设定装配程序就可以正常工作。
另外,如果有更多的细节的实现,比如脸部的眼睛鼻子等等,则需要综合权衡接口类中的构造方法是否足够普遍,别的具体构造者实现是否需要这些方法。
建造者模式的结构图如下:
Bulider是为创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder是具体的建造者,实现Builder接口构造和装配各个部件。
Product指具体的角色。
Director指挥者,构建正在使用Builder接口的对象。
建造者模式主要应用的场景:创建一些复杂的对象,这些对象内部构建间的建造顺序是稳定的,但对象内部的构建通常面临着复杂的变化。即:当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方法时适用建造者模式。
建造者模式好处:
1、最主要的好处是,使得对象的构建与表示分离,可以让表示独立于过程而独立的变化,并且客户端不再需要关心具体的构建过程和表示。
2、由于固定的表示由具体的制造者提供,所以要重复制造几个表示相同的对象的时候,只需要让指挥者控制制造者再进行一次即可。
模板方法模式,遇到一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的,这时把不变行为搬移到父类(超类),提供了一个代码复用的平台,去除了类中的重复代码来体现它的优势。也就是说,当不变和可变的行为在方法的子类实现中混合在一起的时候,把这些行为搬移到单一的地方(父类/超类),帮助子类摆脱重复的不变行为的纠缠。
建造者模式的对象构建过程和这个有些类似,对象的接口类中定义了对象普遍的构造方法,具体的对象构造者建造过程和细节。不同的地方在于建造者模式中对象的接口类只定义对象普遍的构造方法,在建造类中定义了对象的构造流程。若是没有构造者类,建造者模式可以看作一个模板方法模式。
模板方法模式是行为型模式,不仅描述对象或类的模式,还描述它们之间的通信方式,实现过程中采用继承机制在类间分派行为。建造者模式是创建型模式,抽象了实例化过程。在实现方法的骨架层次上,建造者模式中使用的是组合的方式。所以建造者更灵活,而且也可以避免由继承而引发的各种问题。
共同学习,写下你的评论
评论加载中...
作者其他优质文章