假如有一个盖房的项目需求
要求
盖房子有个三个步骤,打桩,砌墙,封顶
房子有各种各样的,比如普通房,高楼,别墅
解决方案
①传统方式
将盖房的方法统一封装到一个父类,用子类(普通房,高楼,别墅)去继承盖房
盖房统一父类House.java
public abstract class House{
//通用的打桩方法
void abstract buildBasic();
//通用的砌墙方法
void abstract buildWalls();
//通用的封顶方法
void abstract roofed();
//通用的建房方法合集
public void build(){
buildBasic();
buildWalls();
roofed();
}
}
建造普通房子类CommonHouse.java
public class CommonHouse extends House{
@Override
public void buildBasic(){
sout("普通房子打桩")
}
@Override
public void buildWalls(){
sout("普通房子砌墙")
}
@Override
public void roofed(){
sout("普通房子封顶")
}
}
客户端Client.java
public class Client{
public static void main(String[] args){
new CommonHouse().build();
}
}
问题:
- 优点比较好理解,简单易操作
- 设计程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,把产品(即:房子)和创建产品的过程(即:建房子流程)封装在一起,耦合性强。
- 解决方案:将产品和产品建造过程解耦==》建造者模式
②建造者模式
基本介绍
- 建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构建出不同表现的对象
- 建造者模式使一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户需要知道内部的具体构建细节。
建造者模式的四个角色
- 产品角色:一个具体的产品对象
- 抽象建造者:创建一个产品对象的各个部件指定的接口/抽象类
- 具体建造者:实现接口,构建和装配各个部件。
- 指挥者:构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
建造者模式盖房子类图
House.java
public class House{
private String baise;
private String wall;
private String roofed;
//省略getter和setter
}
HouseBuilder.java
//抽象的建造者
public abstract class HouseBuilder{
protected House house=new House();
//将建造的流程写好,抽象的方法
public abstract void buildBasic();
public abstract void buildWalls();
public abasract void roofed();
//建造房子后将产品返回
public House buildHouse(){
return house;
}
}
CommonHouse.java
public class CommonHouse extends HouseBuilder{
@Override
public void buildBasic(){
sout("普通房子打地基")
}
@Override
public void buildWalls(){
sout("普通房子砌墙")
}
@Override
public void roofed(){
sout("普通房子封顶")
}
}
HouseDirector.java
public class HouseDirector{
HouseBuilder houseBuilder=null;
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder=houseBuilder;
}
//如何处理建造房子的流程,交给指挥者
public House constructHouse(){
houseBuilder.buildbasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
Client.java
public class Client{
main{
CommonHouse commonHouse=new CommonHouse();
HouseDirector houseDirector=new HouseDirector(commonHouse);
House house=houseDirector.constructHouse();
}
}
适合的应用场景
-
使用生成器模式可避免 “重叠构造函数 (telescopic constructor)**” 的出现。**
-
当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时**,** 可使用生成器模式**。**
-
使用生成器模式可避免 “重叠构造函数 (telescopic constructor)**” 的出现。**
-
当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时**,** 可使用生成器模式**。**
-
使用生成器构造组合树或其他复杂对象**。**