建造者模式定义
定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
先分析模型图上的四大部分:
-
Product:产品类,指要创建的复杂对象,通常实现了模板方法模式。
-
Builder:抽象建造类,规范产品的组建,一般是由子类实现的。
-
ConcreteBuilder:具体建造类,实现抽象建造类定义的方法并返回一个建造好的对象。
-
Director:导演类,也就是指挥者,负责安排流程。
实例说明
就拿建造房屋举例吧:这里假设建造两种类型的房屋,别墅和普通房屋;两种类型的建造流程顺序不同;别墅为A-B-C三步,普通房屋为C-B-A三步。
1.首先定义出Product类,VillaModel和OrdinaryhouseModel
(1).抽象产品类
public abstract class HouseModel {
//定义执行的顺序,放在集合内
private List<String> OrderList=new ArrayList<>();
//建造房屋的步骤,不分先后,不同的房屋,顺序不同
protected abstract void buildstepA();
protected abstract void buildstepB();
protected abstract void buildstepC();
/*
建造房屋
*/
final public void build(){
for (int i=0;i<this.OrderList.size();i++){
String name =this.OrderList.get(i);
if (name.equalsIgnoreCase("stepA")){
this.buildstepA();
}else if (name.equalsIgnoreCase("stepB")){
this.buildstepB();
}else if (name.equalsIgnoreCase("stepC")){
this.buildstepC();
}
}
}
//设置顺序
public void setOrderList(List<String> orderList) {
OrderList = orderList;
}
}
(2).两个实现类
public class VillaModel extends HouseModel {
@Override
protected void buildstepA() {
System.out.println("别墅建造步骤A操作");
}
@Override
protected void buildstepB() {
System.out.println("别墅建造步骤B操作");
}
@Override
protected void buildstepC() {
System.out.println("别墅建造步骤C操作");
}
}
public class OrdinaryhouseModel extends HouseModel {
@Override
protected void buildstepA() {
System.out.println("普通房屋建造步骤A操作");
}
@Override
protected void buildstepB() {
System.out.println("普通房屋建造步骤B操作");
}
@Override
protected void buildstepC() {
System.out.println("普通房屋建造步骤C操作");
}
}
2.定义Builder抽象建造类,也就是写两种房屋的建造方式.
public abstract class HouseBuilder {
//为了设置建造顺序
public abstract void setOrderList(List<String> orderList);
//获取安排完建造顺序的对应的房屋
public abstract HouseModel getHouseModel();
}
3.定义ConcreteBuilder具体建造类,也就是两种房屋建造类实现上面定义的Builder
//别墅
public class VillaBuilder extends HouseBuilder {
private VillaModel villaModel=new VillaModel();
@Override
public void setOrderList(List<String> orderList) {
this.villaModel.setOrderList(orderList);
}
@Override
public HouseModel getHouseModel() {
return this.villaModel;
}
}
//普通房屋
public class OrdinaryhouseBuilder extends HouseBuilder {
private OrdinaryhouseModel ordinaryhouseModel=new OrdinaryhouseModel();
@Override
public void setOrderList(List<String> orderList) {
this.ordinaryhouseModel.setOrderList(orderList);
}
@Override
public HouseModel getHouseModel() {
return this.ordinaryhouseModel;
}
}
注意:上面的准备工作都做完了,为了更深刻的理解Director<导演类>,我们先不加Director,直接去实现此实例。
不加入Director类,实现方式就是直接设置顺序,以建造别墅为例,代码如下:
List<String> OrderList=new ArrayList<>();
OrderList.add("stepA");
OrderList.add("stepB");
OrderList.add("stepC");
VillaBuilder villaBuilder=new VillaBuilder();
villaBuilder.setOrderList(OrderList);
VillaModel villaModel= (VillaModel) villaBuilder.getHouseModel();
villaModel.build();
这还只是别墅的建造,代码是不是很臃肿?所以封装是必须的,既加上Director类来指挥(封装)顺序。
4.定义Director类,也就是对已知的两种房屋的建造步骤进行封装
public class Director {
private List<String> OrderList=new ArrayList<>();
private OrdinaryhouseBuilder ordinaryhouseBuilder=new OrdinaryhouseBuilder();
private VillaBuilder villaBuilder=new VillaBuilder();
/*
普通房屋建造步骤封装
*/
public OrdinaryhouseModel getHouseModel(){
this.OrderList.clear();
this.OrderList.add("stepC");
this.OrderList.add("stepB");
this.OrderList.add("stepA");
this.ordinaryhouseBuilder.setOrderList(OrderList);
return (OrdinaryhouseModel) this.ordinaryhouseBuilder.getHouseModel();
}
/*
别墅建造步骤封装
*/
public VillaModel getvillaModel(){
this.OrderList.clear();
this.OrderList.add("stepA");
this.OrderList.add("stepB");
this.OrderList.add("stepC");
this.villaBuilder.setOrderList(OrderList);
return (VillaModel) this.villaBuilder.getHouseModel();
}
}
这时实现实例的代码如下:
Director director=new Director();
director.getHouseModel().build();
director.getvillaModel().build();
运行结果:
加入了Director类后调用是不是感觉很简单,清晰了。另外如果两种房屋的建造步骤有变化了,可以直接在Director类封装新的顺序。
建造者模式应用
1.实用范围
-
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
-
当构造过程必须允许被构造的对象有不同表示时。
2.建造者模式的优缺点
(1).优点
-
封装性好
-
具体建造类之间独立,扩展性好
(2).缺点
产生多余的Build对象以及Dirextor类。
3.建造者模式与工厂模式的区别
这两种模式很相似,建造者模式更注重于方法的调用顺序,而工厂模式注重于创建产品。具体的区别还是推荐大家去亲身去了解一下这两种模式。
文章学习参考了《设计模式之禅》《Android进阶之光》
推荐阅读
相关推荐
Java设计模式-建造者模式详解 Java设计模式-建造者模式详解将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。...
java设计模式------------------------------------建造者模式
这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...
设计模式之---建造模式 1,建造模式属于对象的创建模式,是将一个产品的内部表象和产品的生产分割出来 2.使用原因:为了将构建复杂对象的过程和它的不见解耦; 3 使用情况:建造模式利用一个导演着对象和一个具体...
JAVA-设计模式-创建型模式-建造者模式
代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...建造者模式(Builder Pattern)、桥梁模式(Bridge Pattern)、命令模式(Command Pattern)、装饰模式(Decorator Pattern)、迭代器模式...
java常用设计模式-建造者模式 -java常用设计模式-建造者模式是java中的一种创建型设计模式,它允许开发者通过一步一步地构建复杂对象来创建不同类型的对象。 建造者模式的定义 建造者模式是一种创建型设计模式,...
这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对25种主要的设计模式进行了详尽的阐述。 首先,我们要理解设计模式的基本概念。设计模式不是代码,而是一种...
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种方法来分步骤构建复杂的对象,使得构建过程和表示分离,使得同样的构建过程可以创建不同的表示。这种模式经常在对象的构造过程中需要进行多种选择...
### 建造者模式详解 #### 概述 建造者模式是一种软件设计模式,属于创建型模式之一,主要用于解决创建复杂对象的问题。在实际应用中,当对象的构造过程过于复杂,涉及到多个属性或者子对象的组合时,直接通过构造...
- 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 对象池模式(Pool):通过重用已创建的对象来减少对象的创建和销毁次数。 2. **结构型模式**:这类模式...
"设计模式-建造者模式" 设计模式是软件开发中常用的解决问题的方法和模式,旨在提高软件的可维护性、灵活性和可重用性。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。今天,我们将讨论创建型模式...
**建造者模式(Builder Pattern)**是软件设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露构建过程。在C++中,这种模式常用于将对象的创建过程与使用过程分离,使得对象的构建更加灵活,...
设计模式05-建造者、原型模式 设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 ...
建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的对象构造过程分离开来,使得相同的构造过程可以创建不同的表示。这种模式在C#编程中广泛应用于创建对象的复杂性较高,或者...
建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在对象的构建过程比较复杂,需要多个步骤时。在建造者模式中,我们创建一个指导对象(Director),该对象负责组织构建过程,而具体的构建...
建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...
建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的构建过程分解为一系列步骤,使得构建过程可以独立于其表示进行。这种模式允许客户端使用相同的构建过程创建不同表现形式的...
本篇将通俗易懂地介绍几种常见的设计模式,并提供相关的Java代码示例。 首先,设计模式主要分为三大类:创建模式、结构模式和行为模式。 **创建模式**关注的是对象的创建。例如: 1. **工厂模式**(Factory ...
建造者模式(Builder)是Java设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。在Android开发中,这种模式尤其有用,因为Android组件如Activity、Fragment等的初始化过程通常...