建造者模式:
-
简单介绍: 是一种创建型设计模式(也叫做是生成器模式),使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象 (工厂模式 创建的是一批对象 )
-
建造者模式的四个角色
- Product(产品角色): 一个具体的产品对象
- Builder(抽象建造者): 创建一个 Product 对象的各个部件指定的 接口/抽象类
- ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件
- Director(指挥者): 构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程
-
代码实现:
-
Product: 就是房子
public class House { private String base; private String wall; private String roofed; public String getBase() { return base; } public void setBase(String base) { this.base = base; } 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; } }
-
抽象建造者:
// 抽象的建造者 abstract class HouseBuilder { protected House house = new House(); //将建造的流程写好, 抽象的方法 public abstract void buildBasic(); public abstract void buildWalls(); public abstract void roofed(); //建造房子好, 将产品(房子) 返回 public House buildHouse() { return house; } }
-
指挥者
class HouseDirector { HouseBuilder houseBuilder = null; //构造器传入 houseBuilder public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //通过 setter 传入 houseBuilder public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //如何处理建造房子的流程,交给指挥者 public House constructHouse() { houseBuilder.buildBasic(); houseBuilder.buildWalls(); houseBuilder.roofed(); return houseBuilder.buildHouse(); } }
-
具体的构建者:
class CommonHouse extends HouseBuilder{ @Override public void buildBasic() { System.out.println(" 普通房子打地基 5 米 "); } @Override public void buildWalls() { System.out.println(" 普通房子砌墙 1 米 "); } @Override public void roofed() { System.out.println(" 普通房子屋顶 木头屋顶 "); } } class NewBeeHouse extends HouseBuilder{ @Override public void buildBasic() { System.out.println(" newBee房子打地基 500 米 "); } @Override public void buildWalls() { System.out.println(" newBee房子砌墙 100 米 "); } @Override public void roofed() { System.out.println(" newBee房子屋顶 newBee屋顶 "); } }
-
Client:
class Client{ public static void main(String[] args) { //盖普通房子 CommonHouse commonHouse = new CommonHouse(); //准备创建房子的指挥者 HouseDirector houseDirector = new HouseDirector(commonHouse); //完成盖房子,返回产品(普通房子) House house = houseDirector.constructHouse(); System.out.println("------------------------------"); //盖普通房子 NewBeeHouse newBeeHouse = new NewBeeHouse(); //准备创建房子的指挥者 HouseDirector houseDirector2 = new HouseDirector(newBeeHouse); //完成盖房子,返回产品(普通房子) House house2 = houseDirector2.constructHouse(); } }
-
-
建造者模式在 JDK 的应用和源码分析 在Mybatis中 就是SqlSessionFactoryBuilder
-
建造者模式的注意事项和细节:
- 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可 以创建不同的产品对象
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具 体建造者, 用户使用不同的具体建造者即可得到不同的产品对象
.