设计模式之建造者模式
2021/9/12 23:05:23
本文主要是介绍设计模式之建造者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
基本介绍
- 又称生成器模式,是一种对象构建模式,他可以将复杂的建造过程抽象出来(抽象类别),使这个抽象工厂的不同实现方法可以构造出不同表示(属性)的对象
- 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要指定内部的具体构建过程
四个角色
- Product(产品角色):一个具体的产品对象
- Builder(抽象建造者):创建一个Product对象的各个部件指定的接口
- ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
- Director(指挥者):构建一个使用Builder接口的对象,它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程
场景
建造房子,有几个步骤,而且每种房子有不同的方式,首先看传统模式下的实现
传统模式
首先创建一个House抽象类,抽象了房子建造的过程方法
public abstract class AbstractHouse { public abstract void buildBasic(); public abstract void buildWalls(); public abstract void roofed(); // 建造房子的步骤 public void build(){ buildBasic(); buildWalls(); roofed(); } }
创建一个具体实现
public class CommonHouse extends AbstractHouse{ @Override public void buildBasic() { System.out.println("普通房子打地基"); } @Override public void buildWalls() { System.out.println("普通房子砌墙"); } @Override public void roofed() { System.out.println("普通房子封顶"); } }
客户端操作
public class Client { public static void main(String[] args) { CommonHouse commonHouse = new CommonHouse(); commonHouse.build(); } }
优点是比较好理解,简单易操作,设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案和创建产品的过程封装在一起,耦合性增强了
解决方法:将产品和产品的建造过程解耦=》建造者模式
实现
首先看看这张url图,看不懂的请自行百度学习。
代码实现
首先创建一个产品类
public class House { private String basic; private String wall; private String roofed; public String getBasic() { return basic; } public void setBasic(String basic) { this.basic = basic; } 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; } }
创建一个建造者
public abstract class HouseBuilder { protected House house = new House(); public abstract void builderBasic(); public abstract void builderWalls(); public abstract void builderRoofed(); public House build(){ return house; } }
创建具体建造者
public class CommonHouse extends HouseBuilder{ @Override public void builderBasic() { System.out.println("普通房子打地基"); } @Override public void builderWalls() { System.out.println("普通房子砌墙"); } @Override public void builderRoofed() { System.out.println("普通房子的屋顶"); } }
public class HighBuilding extends HouseBuilder{ @Override public void builderBasic() { System.out.println("高楼打地基100米"); } @Override public void builderWalls() { System.out.println("高楼砌墙20m"); } @Override public void builderRoofed() { System.out.println("高楼的屋顶"); } }
创建指挥者
public class HouseDirector { private HouseBuilder houseBuilder; // 构造器传入 public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } public HouseBuilder getHouseBuilder() { return houseBuilder; } // set方法传入 public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } // 如何处理建造房子的流程,交给指挥者 public House constractHouse(){ houseBuilder.builderBasic(); houseBuilder.builderWalls(); houseBuilder.builderRoofed(); return houseBuilder.build(); } }
客户端操作
public class Cilent { public static void main(String[] args) { // 普通房子 CommonHouse commonHouse = new CommonHouse(); // 准备创建房子的指挥者 HouseDirector houseDirector = new HouseDirector(commonHouse); // 返回产品 House house = houseDirector.constractHouse(); } }
注意事项和细节
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
- 可以更加精细的控制产品的创建过程。将复杂产品的创建过程步骤分解在不同的方法中,可以使的创建过程更加清晰,也更方便使用程序来控制创建过程
- 增加新的具体建造者无需修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合开闭原则
这篇关于设计模式之建造者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现