今天我们再来学习一种创建型模式,它就是建造者模式(Builder Pattern).
模式定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
模式结构 建造者模式包含如下角色:
Builder: 抽象建造者ConcreteBuilder: 具体建造者Director: 指挥者Product: 产品角色
UML图
代码实现 Builder.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public abstract class Builder { // 设置CPU核心数 public abstract void buildCPU(int core); // 设置内存 public abstract void buildRAM(int gb); // 设置操作系统 public abstract void buildOs(String os); // 创建Computer public abstract Computer create(); }
ApplePCBuilder.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class ApplePCBuilder extends Builder { private Computer mComputer = new AppleComputer(); @Override public void buildCPU(int core) { mComputer.setCPU(core); } @Override public void buildRAM(int gb) { mComputer.setRAM(gb); } @Override public void buildOs(String os) { mComputer.setOs(os); } @Override public Computer create () { return mComputer; } }
Computer.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public abstract class Computer { protected int mCpuCore = 1; protected int mRamSize = 0; protected String mOperationSystem = "Dos" ; // 设置CPU核心数 public abstract void set CPU(int core); // 设置内存 public abstract void set RAM(int gb); // 设置操作系统 public abstract void set Os(String os); @Override public String toString () { return "Computer{" + "mCpuCore=" + mCpuCore + ", mRamSize=" + mRamSize + ", mOperationSystem='" + mOperationSystem + '\' ' + ' }'; } }
AppleComputer.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class AppleComputer extends Computer { @Override public void set CPU(int core) { mCpuCore = core; } @Override public void set RAM(int gb) { mRamSize = gb; } @Override public void set Os(String os) { mOperationSystem = os; } }
Director.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Director { public Builder mBuilder = null; public Director(Builder builder) { mBuilder = builder; } public void construct(int cpu, int ram, String os) { mBuilder.buildCPU(cpu); mBuilder.buildRAM(ram); mBuilder.buildOs(os); } }
测试类 1 2 3 4 5 6 7 8 9 10 public class MyClass { public static void main(String[] args) { Builder builder = new ApplePCBuilder(); Director director =new Director(builder); director.construct(4,8,"Window7" ); System.out.println(builder.create().toString()); } }
模式分析 抽象建造者类中定义了产品的创建方法和返回方法;
建造者模式的结构中还引入了一个指挥者类Director,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象
在客户端代码中,无须关心产品对象的具体组装过程,只需确定具体建造者的类型即可,建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。
建造者模式的优点
在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
可以更加精细地控制产品的创建过程 ,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
建造者模式的缺点
总结 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。
代码已经放到GitHub上了https://github.com/HJXANDHMR/DesignPattern 。
欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧