建造者模式
建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。
用简单语言翻译一下:在软件开发中有时候需要创建一个非常复杂的对象,这个对象通常是有多个子对象按一定逻辑组合而成的。就像汽车流水线,安装骨架、安装引擎、安装邮箱、安装轮胎等等。最后的客户就要一台组装好的车,根本不关心到底车是怎么被安装的。这种场景下建造者模式就被发明出来了。
建造者模式的主要优点:
- 各个具体的建造者相互独立,这有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,有利于控制细节风险。
建造者模式的缺点:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类。
结构与实现
建造者(Builder)模式的主要角色如下。
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
抽象建造者(Builder):它是包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法getResult()。
具体建造者(Concrete Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
模式的实现
需求:用户客厅装修,包含墙体装修,电视机购买与安装,沙发的购买与布局等。
public class ConcreteDecrator1 extends Decorator{ @Override public void buildWall() { product.setWall(" this is white wall"); }
@Override public void buildTV() { product.setTV(" this is 44 white TV"); }
@Override public void builidSofa() { product.setSofa(" this is white sofa"); }
|
public class ConcreteDecrator2 extends Decorator{ @Override public void buildWall() { product.setWall(" this is black wall"); }
@Override public void buildTV() { product.setTV(" this is 44 black TV"); }
@Override public void builidSofa() { product.setSofa(" this is black sofa"); } } |
abstract class Decorator { protected Parlour product = new Parlour();
public abstract void buildWall(); public abstract void buildTV(); public abstract void builidSofa();
public Parlour getResult(){ return product; } } |
public class Parlour { private String wall; private String TV; private String sofa;
public void show(){ System.out.println(wall); System.out.println(TV); System.out.println(sofa); }
public String getWall() { return wall; }
public void setWall(String wall) { this.wall = wall; }
public String getTV() { return TV; }
public void setTV(String TV) { this.TV = TV; }
public String getSofa() { return sofa; }
public void setSofa(String sofa) { this.sofa = sofa; } } |
public class ParlourDecorator { public static void main(String[] args) { Decorator decorator = new ConcreteDecrator1(); ProjectManager projectManager = new ProjectManager(decorator); final Parlour decorate = projectManager.decorate(); decorate.show(); } } |
public class ProjectManager { private Decorator builder; public ProjectManager(Decorator builder){ this.builder = builder; }
public Parlour decorate(){ builder.buildWall(); builder.buildTV(); builder.builidSofa(); return builder.getResult(); } } |
项目源代码:https://github.com/loveflywei/design-pattern
总结:
建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将他们组合在一起的算法却相对稳定。
一个人想要获得好运气,就必须付出5倍的努力,仅仅努力还不够,因为大家都在努力,所以要付出不亚于任何人的努力!——语出《干法》与《态度》 与诸君共勉