建造者模式
建造者又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
它允许用户只通过指定复杂对象的类型和内容就可以建造他们,不需要知道其构建细节。
建造者模式四个角色:
Product(产品角色):一个具体的产品对象
Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类
ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
Director(指挥者):构建一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程
原理图:
举个简单盖房子例子:
普通:
interface BuildHouse{
void doBase();
void doWalls();
void doFloor();
}
class SmallHouse implements BuildHouse {
public SmallHouse() {
doBase();
doWalls();
doFloor();
}
@Override
public void doBase() {
System.out.println("小房子打地基");
}
@Override
public void doWalls() {
System.out.println("小房子砌墙");
}
@Override
public void doFloor() {
System.out.println("小房子盖楼");
}
}
class Bighouse implements BuildHouse{
public Bighouse() {
doBase();
doWalls();
doFloor();
}
@Override
public void doBase() {
System.out.println("大房子打地基");
}
@Override
public void doWalls() {
System.out.println("大房子砌墙");
}
@Override
public void doFloor() {
System.out.println("大房子盖楼");
}
}
优点:好理解 简单易操作
缺点:设计的程序结构过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,把产品(即:房子)和创建产品的过程(房子创建流程)封装在了一起,耦合性更强
采用建造者模式:
1.将建造过程抽离出来并抽象化
2.建造接口关联house产品类
3.按需重写相应建造流程方法
4.通过指挥者来拿到相应对象
//采用建造者模式进行改进
//房子原型对象
class House{
private String base;
private String walls;
private String floor;
public String getBase() {
return base;
}
public void setBase(String base) {
this.base = base;
}
public String getWalls() {
return walls;
}
public void setWalls(String walls) {
this.walls = walls;
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
@Override
public String toString() {
return "House{" +
"base='" + base + '\'' +
", walls='" + walls + '\'' +
", floor='" + floor + '\'' +
'}';
}
}
//创建者抽象类
abstract class HouseBuilder{
// 关联对象
House house = new House();
abstract void doBase();
abstract void doWalls();
abstract void doFloors();
// 返回house
House getHouse(){
doBase();
doWalls();
doFloors();
return house;
}
}
//相应创建者
class SmallHouse2 extends HouseBuilder {
@Override
public void doBase() {
super.house.setBase("小地基");
System.out.println("小房子打地基");
}
@Override
public void doWalls() {
super.house.setWalls("小墙");
System.out.println("小房子砌墙");
}
@Override
public void doFloors() {
super.house.setFloor("小楼");
System.out.println("小房子盖楼");
}
}
class Bighouse2 extends HouseBuilder{
@Override
public void doBase() {
super.house.setBase("大地基");
System.out.println("大房子打地基");
}
@Override
public void doWalls() {
super.house.setWalls("大墙");
System.out.println("大房子砌墙");
}
@Override
public void doFloors() {
super.house.setFloor("大楼");
System.out.println("大房子盖楼");
}
}
//管理者
class HouseDirextor{
// 聚合建造者接口
HouseBuilder houseBuilder = null;
public HouseDirextor(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public House controllerBuildHouse(){
House house = houseBuilder.getHouse();
return house;
}
}