建造者模式
盖房项目需求
盖房项目需求
- 需要建房子:这一过程为打桩、砌墙、封顶
- 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是
要求不要相同的. - 请编写程序,完成需求.
代码实现:
House类:不管什么样的房子他都有地板,墙,和屋顶package 设计模式.建造者模式.最初;
/**
* @author 孙一鸣 on 2020/2/7
*/
public class House {
//地板
private String floor;
//墙
private String wall;
//屋顶
private String housetop;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getHousetop() {
return housetop;
}
public void setHousetop(String housetop) {
this.housetop = housetop;
}
}
【方案一:】直接由客户造房子,地板,墙,屋顶 全都是客户自己去制造
public class Client {
public static void main(String[] args) {
//客户直接造房子
House house = new House();
house.setFloor("地板");
house.setWall("墙");
house.setHousetop("屋顶");
}
}
显然这种方式不合适,这个时候,房屋施工队就出场了,所谓术业有专攻,盖平房的施工队,盖高楼他就没有对应的材料了,但是他们建造楼房,都需要去铺地板,垒墙,建屋顶,这些大家都得有的工作,因此,我们为了应对多种房屋制造情况(高楼,别墅,平房等),我们建立一个施工队模板(接口),让具有不同材料的施工队去实现它
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeHousetop();
}
平房施工队出场:
/**
* @author 孙一鸣 on 2020/2/7
*/
public class PingFangBuilder implements HouseBuilder {
//平房施工队首先得有房子的地基,这样才能在地基的基础上不断施工
House house = new House();
@Override
public void makeFloor() {
house.setFloor("给--平房--铺地板");
}
@Override
public void makeWall() {
house.setWall("给--平房--垒墙");
}
@Override
public void makeHousetop() {
house.setHousetop("给--平房--搭建屋顶");
}
//施工队建设完后,交出房子
public House getHouse(){
return house;
}
}
【方案二:】客户自己联系了一个平房施工队,由施工队建造,客户收房
package 设计模式.建造者模式.最初;
/**
* @author 孙一鸣 on 2020/2/7
*/
public class Client {
public static void main(String[] args) {
//客户直接造房子
// House house = new House();
// house.setFloor("地板");
// house.setWall("墙");
// house.setHousetop("屋顶");
//有施工队建造房子
//1.客户自己联系了一个平房施工队
PingFangBuilder builder = new PingFangBuilder();
builder.makeFloor();
builder.makeWall();
builder.makeHousetop();
House house = builder.getHouse();
System.out.println("house = " + house);
}
}
这个时候就该引出我们今天的主角了-------建造者模式,大家先看一下这张图
我们发现上面客户还需要自己去联系施工队伍,由客户去直接和施工队交流不是一个好的方案,我们需要和施工队的管理人员去交流,有他们的管理人员去沟通自己的施工队,因此,我们引入一个新的成员Director,也就是大家所说的包工头
包工头Director代码实现:
package 设计模式.建造者模式.最初;
/**
* @author 孙一鸣 on 2020/2/7
*/
public class 包工头 {
//包工头有自己的施工队伍
// private HouseBuilder builder;
// public 包工头(HouseBuilder builder) {
// this.builder = builder;
// }
//包工头指挥自己的施工队干活
public void makeHouse(HouseBuilder builder){
builder.makeFloor();
builder.makeWall();
builder.makeHousetop();
}
}
【方案三:】客户联系包工头,让包工头指挥施工队建造房子,客户收房
package 设计模式.建造者模式.最初;
/**
* @author 孙一鸣 on 2020/2/7
*/
public class Client {
public static void main(String[] args) {
//客户直接造房子
// House house = new House();
// house.setFloor("地板");
// house.setWall("墙");
// house.setHousetop("屋顶");
//有施工队建造房子
//1.客户自己联系了一个平房施工队
// PingFangBuilder builder = new PingFangBuilder();
// builder.makeFloor();
// builder.makeWall();
// builder.makeHousetop();
// House house = builder.getHouse();
// System.out.println("house = " + house);
//客户联系包工头,让包工头指挥施工队建造房子
//施工队
PingFangBuilder builder = new PingFangBuilder();
包工头 director =new 包工头();
//包工头指挥施工队做事。。。
director.makeHouse(builder);
House house = builder.getHouse();
System.out.println("house = " + house);
}
}
这个时候建造者模式已经表达完毕了,假如我们现在有钱了,要建高楼了,该怎么修改代码呢?
建造大楼,我们就联系包工头Director,让包工头去指挥自己的高楼施工队builder
高楼施工队builder代码实现:
package 设计模式.建造者模式.最初;
/**
* @author 孙一鸣 on 2020/2/7
*/
public class HighBuilder implements HouseBuilder {
//高楼施工队首先得有房子的地基,这样才能在地基的基础上不断施工
House house = new House();
@Override
public void makeFloor() {
house.setFloor("给--高楼--铺地板");
}
@Override
public void makeWall() {
house.setWall("给--高楼--垒墙");
}
@Override
public void makeHousetop() {
house.setHousetop("给--高楼--搭建屋顶");
}
//施工队建设完后,交出房子
public House getHouse(){
return house;
}
}
//客户联系包工头,让包工头指挥施工队建造房子
//高楼施工队
HighBuilder builder =new HighBuilder();
包工头 director =new 包工头();
//包工头指挥施工队做事。。。
director.makeHouse(builder);
House house = builder.getHouse();
System.out.println("house = " + house);
看到这里我们就得需要联系理论来看建造者模式了
基本介绍:
- 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以
将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方
法可以构造出不同表现(属性)的对象。
复杂对象 :房子
通过不同的施工队构造出不同的房子
- 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象
的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
客户只需要去联系包工头,就可以得到房子
建造者模式的四个角色
- Product(产品角色): 一个具体的产品对象。==== 房子
- Builder(抽象建造者): 创建一个Product对象的各个部件指定的 接口/抽象类。
- ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。具体施工队
- Director(指挥者)包工头: 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:
负责控制产品对象的生产过程。
建造者模式的注意事项和细节:
-
客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解
耦,使得相同的创建过程可以创建不同的产品对象 -
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替
换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同
的产品对象扫描二维码关注公众号,回复: 9073791 查看本文章 -
**可以更加精细地控制产品的创建过程 。**将复杂产品的创建步骤分解在不同的方法
中,使得创建过程更加清晰,也更方便使用程序来控制创建过程 -
增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,
系统扩展方便,符合 “开闭原则” -
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间
的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 -
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,
导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式. -
抽象工厂模式VS建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不
同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品
由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要
目的是通过组装零配件而产生一个新产品