建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示。建造者模式将一个产品的内部表象和产品的生成过程分割开来,建造对象的时候只需要指定需要建造的类型,而不必了解具体的建造过程。
案例
一个玩具工厂,工人们建造新的玩具人时,需要逐个安装各个部分,种类有胖虎和小夫。万一粗心大意忘记装了某个部分,就出现了不合格的玩具,缺胳膊少腿。为了减少次品率,老板引入了一台机器,设定好程序后,工人只要选择制造的玩具种类,按下开关之后机器自动就去装配对应的玩具。
// 首先是一个建造人物的接口(机器类,作为一个制造者,对玩具而言是个上帝般的角色,展示了装配一个玩具的各个过程)
class God {
private IPerson person;
public God(IPerson person) {
this.person = person;
}
public void createPerson() {
person.buildHead();
person.buildBody();
person.buildArms();
person.buildLegs();
System.out.println("合成了一个" + person);
}
}
// 然后是玩具的接口类和两个具体的玩具实现类(机器程序设定的程序,规定了作为一个玩具必须要有的零件)
interface IPerson {
public void buildHead();
public void buildBody();
public void buildArms();
public void buildLegs();
public String toString();
}
class Fatter implements IPerson {
@Override
public void buildHead() {
System.out.println("组成胖头部");
}
@Override
public void buildBody() {
System.out.println("组成胖身体");
}
@Override
public void buildArms() {
System.out.println("组成胖胳膊");
}
@Override
public void buildLegs() {
System.out.println("组成胖腿");
}
@Override
public String toString() {
return "胖虎";
}
}
class Thinner implements IPerson {
@Override
public void buildHead() {
System.out.println("组成瘦头部");
}
@Override
public void buildBody() {
System.out.println("组成瘦身体");
}
@Override
public void buildArms() {
System.out.println("组成瘦胳膊");
}
@Override
public void buildLegs() {
System.out.println("组成瘦腿");
}
@Override
public String toString() {
return "小夫";
}
}
//最后是测试类
public class BuilderTest {
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();
}
}
这样工人工作的时候只需要选择特定的模型,然后运行机器就可以得到合格的玩具,而且不必关心装配玩具的具体细节。即使后面新增了大雄静香等需求订单,只需要在机器中设定装配程序就可以正常工作。 应用场景
创建一些复杂的对象,这些对象内部构建间的建造顺序是稳定的,但对象内部的构建通常面临着复杂的变化。即:当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方法时适用建造者模式。建造者模式好处
1、最主要的好处是,使得对象的构建与表示分离,可以让表示独立于过程而独立的变化,并且客户端不再需要关心具体的构建过程和表示。2、由于固定的表示由具体的制造者提供,所以要重复制造几个表示相同的对象的时候,只需要让指挥者控制制造者再进行一次即可。
转自:https://www.imooc.com/article/15558