写在后面
- 记录学习设计模式的笔记
- 进步对设计模式的灵活运用
学习地址
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建造者模式
形象工厂模式实现对产品家族的创立,一个产品家族是这样的一系列产品:具备不同分类维度的产品组合,采纳形象工厂模式则是不须要关怀构建过程,只关怀什么产品由什么工厂生产即可。
建造者模式则是要求依照指定的蓝图建造产品,它的次要目标是通过组装零配件而产生一个新产品。
如果将形象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装能够返回一辆残缺的汽车。
- 建造者模式更加重视办法的调用程序,工厂模式重视创建对象。
- 创建对象的力度不同,建造者模式创立简单的对象,由各种简单的部件组成,工厂模式创立进去的对象都一样
- 关注重点不一样,工厂模式只须要把对象创立进去就能够了,而建造者模式不仅要创立出对象,还要晓得对象由哪些部件组成。
- 建造者模式依据建造过程中的程序不一样,最终对象部件组成也不一样。
写在最初
- 如果我的文章对你有用,请给我点个,感激你!
- 有问题,欢送在评论区指出!