建造者模式
创立型模式
建造者模式(Builder Pattern)应用多个简略的对象一步一步构建成一个简单的对象。它提供了一种创建对象的最佳形式。
一个 Builder 类会一步一步结构最终的对象。该 Builder 类是独立于其余对象的。
介绍
用意:将一个简单的构建与其示意相拆散,使得同样的构建过程能够创立不同的示意。
次要解决:次要解决在软件系统中,有时候面临着"一个简单对象"的创立工作,其通常由各个局部的子对象用肯定的算法形成;因为需要的变动,这个简单对象的各个局部常常面临着激烈的变动,然而将它们组合在一起的算法却绝对稳固。
何时应用:一些根本部件不会变,而其组合常常变动的时候。
如何解决:将变与不变分来到。
要害代码:建造者:创立和提供实例,导演:治理建造进去的实例的依赖关系。
利用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是常常变动的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
具体实现
以盖房子为例
第一种(传统模式)
public abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌墙 public abstract void buildWalls(); //封顶 public abstract void roofed(); public void build(){ buildBasic(); buildWalls(); roofed(); }}
public class CommonHouse extends AbstractHouse{ @Override public void buildBasic() { System.out.println("一般房子打地基"); } @Override public void buildWalls() { System.out.println("一般房子砌墙"); } @Override public void roofed() { System.out.println("一般房子盖屋顶"); }}
public class Client { public static void main(String[] args){ CommonHouse commonHouse = new CommonHouse(); commonHouse.build(); }}
长处:
便于了解,简略易操作。
毛病:
设计的程序结构,过于简略,没有设计缓存层对象,程序的扩大和保护不好,也就是说,这种设计方案,把产品(房子)和创立产品的过程(创立房子的流程)封装在了一起,加强了耦合性。
解决方案:
将产品和产品建造过程解耦 =》 建造者模式
第二种 (建造者模式)
创立一个屋宇
public class House { private String basic; private String wall; private String roofed; public String getBasic() { return basic; } public void setBasic(String basic) { this.basic = basic; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getRoofed() { return roofed; } public void setRoofed(String roofed) { this.roofed = roofed; }}
创立一个形象的建造者
public abstract class HouseBuilder { protected House house = new House(); //将建造的流程写好,形象的办法 public abstract void buildBasic(); public abstract void buildWalls(); public abstract void buildRoofed(); public House buildHouse() { return house; }}
创立具体实现的屋宇
public class CommonHouse extends HouseBuilder { @Override public void buildBasic() { System.out.println("一般房子打地基5米"); } @Override public void buildWalls() { System.out.println("一般房子砌墙10厘米"); } @Override public void buildRoofed() { System.out.println("一般房子盖一般屋顶"); }}
public class HighBuilding extends HouseBuilder { @Override public void buildBasic() { System.out.println("高楼打地基100米"); } @Override public void buildWalls() { System.out.println("高楼的砌墙20厘米"); } @Override public void buildRoofed() { System.out.println("高楼的屋顶是通明的"); }}
创立一个指挥者
public class HouseDirector { private HouseBuilder houseBuilder; //结构器传入 public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //如何解决建造房子的流程,交给指挥者 public House constructHouse() { houseBuilder.buildBasic(); houseBuilder.buildWalls(); houseBuilder.buildRoofed(); return houseBuilder.buildHouse(); }}
public class Client { public static void main(String[] args) { //盖一般房子 CommonHouse commonHouse = new CommonHouse(); //筹备创立房子的指挥者 HouseDirector houseDirector = new HouseDirector(commonHouse); //返回房子 House house = houseDirector.constructHouse(); }}
长处:
1、建造者独立,易扩大。 2、便于管制细节危险。
毛病:
1、产品必须有共同点,范畴有限度。 2、如外部变动简单,会有很多的建造类。
注意事项:
与工厂模式
的区别是:建造者模式更加关注与整机拆卸的程序。而工厂模式更加关注是由什么工厂来创立。