无废话设计模式(3)建造者模式
0-前言
建造者模式也是创建型模式的一种,先简单介绍下它的几部分(不画UML图,直接看代码哈):
A、产品(Product):描述一个由一系列部件组成较为复杂的对象。
B、抽象建造者(builder):建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。
C、具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。
D、指挥者(Director):调用具体建造者来创建复杂对象的各个部分,并按照一定顺序来建造复杂对象。
1-建造者模式实现
1-1、产品(Product)
//1、产品对象(product) class Phone { private String Mainboard; //主板 private String Screen; //屏幕 private String Shell; //外壳 public String getMainboard() { return Mainboard; } public void setMainboard(String mainboard) { Mainboard = mainboard; } public String getScreen() { return Screen; } public void setScreen(String screen) { Screen = screen; } public String getShell() { return Shell; } public void setShell(String shell) { Shell = shell; } @Override public String toString() { return "Phone{" + "Mainboard='" + Mainboard + '\'' + ", Screen='" + Screen + '\'' + ", Shell='" + Shell + '\'' + '}'; } }
1-2、抽象建造者(builder)
//2、抽象建造者(Builder) abstract class Builder { abstract void bulidMainboard(); //建造主板 abstract void bulidScreen(); //建造屏幕 abstract void bulidShell(); //建造外壳 //完工-返回手机产品 abstract Phone getPhone(); }
1-3、具体建造者(ConcreteBuilder)
//3、具体建造者 class IphoneBuilder extends Builder { private Phone phone; public IphoneBuilder() { phone = new Phone(); } @Override void bulidMainboard() { phone.setMainboard("安装了苹果手机主板!"); } @Override void bulidScreen() { phone.setScreen("安装了苹果手机的屏幕!"); } @Override void bulidShell() { phone.setShell("安装了苹果手机的外壳!"); } @Override public Phone getPhone() { return phone; } }
1-4、指挥者(Director)
//4、指挥者(Director)
class Director
{
//指挥工人按顺序建造手机
public Phone create(Builder builder)
{
builder.bulidMainboard();
builder.bulidScreen();
builder.bulidShell();
return builder.getPhone();
}
}
1-5、客户端:
Director director =new Director(); Phone phone = director.create(new IphoneBuilder()); System.out.println(phone.toString());
2-简单总结
优点:
1、产品的建造和表示分离,实现了解耦。
2、将复杂产品的创建步骤形成统一
3、增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
缺点:
1、产品必须有共同点,限制了使用范围。
2、如内部变化复杂,会有很多的建造类,难以维护。
适用场景:
1、需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
3、需要生成的对象内部属性本身相互依赖。
4、适合于一个具有较多的零件(属性)的产品(对象)的创建过程。