1. 简介
建造者模式(Builder Pattern)是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
这种类型的设计模式属于创建型模式(提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活)。
2. 四个角色
- Builder:建造者,给出一个抽象接口,以规范产品对象各组成部分的建造。只规定要创建具体化对象的哪些部分,不涉及具体对象部件的创建。
- ConcreteBuilder:具体建造者,实现Builder角色创建的接口,针对不同的商业逻辑,具体对象各部分的创建。建造完成后,提供产品的实例。
- Director:指挥者,调用ConcreteBuilder来创建具体对象的各部分,只负责对象各部分完整创建或按某种顺序创建,不涉及具体产品的信息。
- Product:具体产品,要创建的具体对象。
3. 应用
建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
4. 代码实例:某游戏各等级装备的创建
4.1 Product类(具体产品类)
public class EquipmentProduct {
/**
* 武器
*/
private String weapon;
/**
* 帽子
*/
private String hat;
/**
* 衣服
*/
private String dress;
/**
* 鞋子
*/
private String shoes;
public String getWeapon() {
return weapon;
}
public void setWeapon(String weapon) {
this.weapon = weapon;
}
public String getHat() {
return hat;
}
public void setHat(String hat) {
this.hat = hat;
}
public String getDress() {
return dress;
}
public void setDress(String dress) {
this.dress = dress;
}
public String getShoes() {
return shoes;
}
public void setShoes(String shoes) {
this.shoes = shoes;
}
}
Builder接口(建造者标准接口)
public interface EquipmentBuilder {
public void buildWeapon();
public void buildHat();
public void buildDress();
public void buildShoes();
public EquipmentProduct createProduct();
}
4.3 两个具体建造者类(实现Builder接口)
public class EquipmentBuilderForLv100 implements EquipmentBuilder {
private EquipmentProduct ep;
public EquipmentBuilderForLv100() {
this.ep = new EquipmentProduct();
}
@Override
public void buildWeapon() {
ep.setWeapon("风火游龙枪");
}
@Override
public void buildHat() {
ep.setHat("九霄烈焰冠");
}
@Override
public void buildDress() {
ep.setDress("天衣");
}
@Override
public void buildShoes() {
ep.setShoes("踏云靴");
}
@Override
public EquipmentProduct createProduct() {
return ep;
}
}
public class EquipmentBuilderForLv120 implements EquipmentBuilder {
private EquipmentProduct ep;
public EquipmentBuilderForLv120() {
this.ep = new EquipmentProduct();
}
@Override
public void buildWeapon() {
ep.setWeapon("混元斩龙戟");
}
@Override
public void buildHat() {
ep.setHat("七星宝冠");
}
@Override
public void buildDress() {
ep.setDress("诸天法袍");
}
@Override
public void buildShoes() {
ep.setShoes("钧天履");
}
@Override
public EquipmentProduct createProduct() {
return ep;
}
}
4.4 指挥者类(创建某等级装备)
public class EquipmentDirector {
public EquipmentProduct createEquipmentProductByDirector(EquipmentBuilder equipBuilder) {
equipBuilder.buildWeapon();
equipBuilder.buildHat();
equipBuilder.buildDress();
equipBuilder.buildShoes();
return equipBuilder.createProduct();
}
}
4.5 测试类(创建100级和120级装备)
public class BuilderTestMain {
public static void main(String[] args) {
EquipmentDirector ed = new EquipmentDirector();
EquipmentProduct ep = ed.createEquipmentProductByDirector(new EquipmentBuilderForLv100());
System.out.println(ep.getWeapon());
System.out.println(ep.getHat());
System.out.println(ep.getDress());
System.out.println(ep.getShoes());
System.out.println("===============================");
ep = ed.createEquipmentProductByDirector(new EquipmentBuilderForLv120());
System.out.println(ep.getWeapon());
System.out.println(ep.getHat());
System.out.println(ep.getDress());
System.out.println(ep.getShoes());
}
}
5. 优缺点
5.1 优点
- 易于拓展。
- 代码解耦,模块化,方便维护。
5.2 缺点
维护成本高,如果建造者内部发生变更,就不太适合建造者这种模式了。
参考链接
最后,谢谢各位读者的耐心阅读,如有语句不通顺或者不准确的地方,还请指正!谢谢!(__)