建造者模式的使用场景
1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
2)多个部件或者零件,都可以装配到一个对象中,但是产品的运行效果又不相同时,可以采用该模式。
3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同效能,这个时候使用建造者模式非常适合。
4)在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发现,而要通过建造者模式柔化创建过程,本身已经违反了设计的最初目标。
下面是建造者模式的通用代码,先看Product类,通常它是一个组合或继承产生的类。
//抽象产品类 public abstract class Product { protected abstract void doSomething(); protected abstract void doAnything(); public void startAction() { this.doSomething(); this.doAnything(); } } //具体产品类A public class ConcreteProductA extends Product { @Override protected void doSomething() { //业务处理 } @Override protected void doAnything() { //业务处理 } } //具体产品类B public class ConcreteProductB extends Product { @Override protected void doSomething() { //业务处理 } @Override protected void doAnything() { //业务处理 } } //抽象建造者 public abstract class Builder { //设置产品的不同部分,以获得不同的产品 public abstract void setPart(); //建造产品 public abstract Product buildProduct(); }
//具体的建造者A public class ConcreteBuilderA extends Builder { private Product product = new ConcreteProductA(); //设置产品零件 public void setPart() { //产品内的逻辑处理 } public Product buildProduct() { return product; } } //具体的建造者B public class ConcreteBuilderB extends Builder { private Product product = new ConcreteProductB(); //设置产品零件 public void setPart() { //产品内的逻辑处理 } public Product buildProduct() { return product; } }
//导演类 public class Director { private Builder builderA = new ConcreteBuilderA(); private Builder builderB = new ConcreteBuilderB(); //构建A产品 public Product getAProduct() { builderA.setPart(); /* * *设置不同的零件,产生不同的产品 */ return builderA.builderProduct(); } //构建B产品 public Product getBProduct() { builderB.setPart(); /* * *设置不同的零件,产生不同的产品 */ return builderB.builderProduct(); } } //场景类 public class Client { public static void main(String[] args) { Director director = new Director(); //生产1万种产品A for (int i = 0l i < 10000; ++i) { director.getAProduct().startAction(); } //生产1万种产品B for (int i = 0l i < 10000; ++i) { director.getBProduct().startAction(); } }建造者模式的优点