共计 4195 个字符,预计需要花费 11 分钟才能阅读完成。
写在后面
- 记录学习设计模式的笔记
- 进步对设计模式的灵活运用
学习地址
https://www.bilibili.com/video/BV1G4411c7N4
https://www.bilibili.com/video/BV1Np4y1z7BU
参考文章
http://c.biancheng.net/view/1317.html
我的项目源码
https://gitee.com/zhuang-kang/DesignPattern
8,建造者模式
8.1 建造者模式的定义和特点
建造者(Builder)模式的定义:指将一个简单对象的结构与它的示意拆散,使同样的构建过程能够创立不同的示意,这样的设计模式被称为建造者模式。它是将一个简单的对象合成为多个简略的对象,而后一步一步构建而成。它将变与不变相拆散,即产品的组成部分是不变的,但每一部分是能够灵便抉择的。
该模式的次要长处如下:
- 封装性好,构建和示意拆散。
- 扩展性好,各个具体的建造者互相独立,有利于零碎的解耦。
- 客户端不用晓得产品外部组成的细节,建造者能够对创立过程逐渐细化,而不对其它模块产生任何影响,便于管制细节危险。
其毛病如下:
- 产品的组成部分必须雷同,这限度了其应用范畴。
- 如果产品的外部变动简单,如果产品外部发生变化,则建造者也要同步批改,前期保护老本较大。
8.2 建造者模式的构造与实现
8.2.1 建造者模式的构造
- 产品角色(Product):它是蕴含多个组成部件的简单对象,由具体建造者来创立其各个零部件。
- 形象建造者(Builder):它是一个蕴含创立产品各个子部件的形象办法的接口,通常还蕴含一个返回简单产品的办法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,实现简单产品的各个部件的具体创立办法。
- 指挥者(Director):它调用建造者对象中的部件结构与拆卸办法实现简单对象的创立,在指挥者中不波及具体产品的信息。
8.2.2 代码实现
House 产品角色
package com.zhuang.builder;
/**
* @Classname House
* @Description 产品实现类
* @Date 2021/3/20 11:49
* @Created by dell
*/
public class House {
private String ground;
private String wall;
private String roofed;
public House() {}
public House(String ground, String wall, String roofed) {
this.ground = ground;
this.wall = wall;
this.roofed = roofed;
}
public String getGround() {return ground;}
public void setGround(String ground) {this.ground = ground;}
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;}
@Override
public String toString() {
return "House{" +
"ground='" + ground + '\'' +
", wall='" + wall + '\'' +
", roofed='" + roofed + '\'' +
'}';
}
}
HouseBuilder 形象建造者
package com.zhuang.builder;
/**
* @Classname HouseBuilder
* @Description 形象建造者
* @Date 2021/3/20 11:49
* @Created by dell
*/
public abstract class HouseBuilder {
// 创立产品对象
protected House house = new House();
// 生产产品流程
public abstract void buildGround();
public abstract void buildWall();
public abstract void buildRoofed();
// 返回产品对象
public House getHouse() {return house;}
}
HighHouse 具体建造者
package com.zhuang.builder;
/**
* @Classname HighHouse
* @Description 具体建造者
* @Date 2021/3/20 11:51
* @Created by dell
*/
public class HighHouse extends HouseBuilder {
@Override
public void buildGround() {house.setGround("100 平");
System.out.println("高楼:打地基");
}
@Override
public void buildWall() {house.setWall("50 米");
System.out.println("高楼:砌墙 50 米");
}
@Override
public void buildRoofed() {house.setRoofed("天窗");
System.out.println("别墅:盖天窗");
}
}
VillaHouse 具体建造者
package com.zhuang.builder;
/**
* @Classname VillaHouse
* @Description 具体建造者
* @Date 2021/3/20 11:51
* @Created by dell
*/
public class VillaHouse extends HouseBuilder {
@Override
public void buildGround() {house.setGround("200 平");
System.out.println("别墅:打地基");
}
@Override
public void buildWall() {house.setWall("10 米");
System.out.println("别墅:砌墙 10 米");
}
@Override
public void buildRoofed() {house.setRoofed("天花板");
System.out.println("别墅:盖天花板");
}
}
HouseDirector 指挥者
package com.zhuang.builder;
/**
* @Classname HouseDirector
* @Description 工程指挥者
* @Date 2021/3/20 11:50
* @Created by dell
*/
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder) {this.houseBuilder = houseBuilder;}
public House build() {houseBuilder.buildGround();
houseBuilder.buildWall();
houseBuilder.buildRoofed();
return houseBuilder.getHouse();}
}
Client
package com.zhuang.builder;
/**
* @Classname Client
* @Description 产品试用客户端
* @Date 2021/3/20 11:51
* @Created by dell
*/
public class Client {public static void main(String[] args) {House house1 = new HouseDirector(new VillaHouse()).build();
System.out.println(house1);
System.out.println("============================================");
House house2 = new HouseDirector(new HighHouse()).build();
System.out.println(house2);
}
}
8.3 建造者模式的利用场景
- 雷同的办法,不同的执行程序,产生不同的后果。
- 多个部件或整机,都能够拆卸到一个对象中,然而产生的后果又不雷同。
- 产品类非常复杂,或者产品类中不同的调用程序产生不同的作用。
- 初始化一个对象特地简单,参数多,而且很多参数都具备默认值。
9,创建者模式比照
9.1 工厂办法模式 VS 建造者模式
工厂办法模式重视的是 整体对象的创立形式 ;而建造者模式重视的是 部件构建的过程,意在通过一步一步地准确结构创立出一个简单的对象。
咱们举个简略例子来阐明两者的差别,如要制作一个超人,如果应用工厂办法模式,间接产生进去的就是一个力大无穷、可能翱翔、内裤外穿的超人;而如果应用建造者模式,则须要组装手、头、脚、躯干等局部,而后再把内裤外穿,于是一个超人就诞生了。
9.2 形象工厂模式 VS 建造者模式
形象工厂模式实现对产品家族的创立,一个产品家族是这样的一系列产品:具备不同分类维度的产品组合,采纳形象工厂模式则是不须要关怀构建过程,只关怀什么产品由什么工厂生产即可。
建造者模式则是要求依照指定的蓝图建造产品,它的次要目标是通过组装零配件而产生一个新产品。
如果将形象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装能够返回一辆残缺的汽车。
- 建造者模式 更加重视办法的调用程序 ,工厂模式 重视创建对象。
- 创建对象的力度不同,建造者模式创立简单的对象,由各种简单的部件组成,工厂模式创立进去的对象都一样
- 关注重点不一样,工厂模式只须要把对象创立进去就能够了,而建造者模式不仅要创立出对象,还要晓得对象由哪些部件组成。
- 建造者模式依据建造过程中的程序不一样,最终对象部件组成也不一样。
写在最初
- 如果我的文章对你有用,请给我点个👍,感激你😊!
- 有问题,欢送在评论区指出!💪