设计模式:建造者模式
一个产品通常由不同的组成成分构成,这些成分构成产品的内部表象。不同的产品有不同的内部表象,也就时不同的成分。
建造者模式使客户端不关注产品的具体成分,只需要关注具体的产品。建造者对象返回给客户端的是一个由零件所构成的完全对象。
场景:建造者模式实现构建和装配的解耦,不同的构建器,相同的装配方法,构建出不同的对象。
比如:StringBuild的append方法, SAX解析中的SaxBuilder等。
/** * 比如一个苹果手机产品,由摄像头,系统,cpu构成 */ public class Iphone { //摄像头 private Camera camera; //系统 private Ios Ios; //cpu private AppleChip appleChip; public Iphone(Camera camera, com.test.game.design.build.Ios ios, AppleChip appleChip) { this.camera = camera; Ios = ios; this.appleChip = appleChip; } } class Camera { private String name; public Camera(String name) { this.name = name; } } class AppleChip { private String name; public AppleChip(String name) { this.name = name; } } class Ios { private String name; public Ios(String name) { this.name = name; } }
/** * 创建一个构建者 构建 产品零件 */ public interface IphoneBuilder { Camera builderCamera(); Ios buildIos(); AppleChip buildAppleChip(); }
/** * 生产苹果零件 */ public class ChinaIphoneBuilder implements IphoneBuilder{ @Override public Camera builderCamera() { System.out.println("生产苹果摄像头"); return new Camera("camera"); } @Override public Ios buildIos() { System.out.println("生产苹果IOS系统"); return new Ios("IOS"); } @Override public AppleChip buildAppleChip() { System.out.println("生产苹果CPU"); return new AppleChip("cpu"); } }
/** * 组装Iphone */ public interface IphoneDirector { Iphone createIphone(); }
/** * 生产产品 */ public class ChinaIphoneDirector implements IphoneDirector{ private IphoneBuilder builder; public ChinaIphoneDirector(IphoneBuilder builder) { this.builder = builder; } @Override public Iphone createIphone() { return new Iphone(builder.builderCamera(), builder.buildIos(), builder.buildAppleChip()); } }
/** * 模拟调用 */ public class Client { public static void main(String[] args) { IphoneDirector director = new ChinaIphoneDirector(new ChinaIphoneBuilder()); Iphone iphone = director.createIphone(); } }
建造者模式包含以下角色:
抽象建造者(IphoneBuilder): 抽象产品零件的构造
具体建造者(ChinaIphoneBuilder):生产具体产品的零件
调用者(director):调用建造者,创建产品
具体产品(Iphone)。
建造者模式和抽象工厂模式非常相似,都能解决由多个对象构成具体产品的问题。但实际上还是存在区别
抽象工厂中每一次工厂对象被调用时都返回一个完整的对象,而调用者可能会使用这个对象,也有可能作用
与其他的对象。也就是工厂产生的对象可能不是最终对象,也可能是。而建造者模式则不同,生成的对象是
完整的。生成的过程发生在建造者内部。可以由抽象工厂来生成建造者模式需要的对象。