建造者模式

建造者模式
需求分析:
  1. 需要建房子:这一过程为打桩、砌墙、封顶
  2. 房子有各种各样的要求,比如普通房子,高楼,别墅,各种房子的过程虽然一样,但是要求不同

虽然各种房子的具体要求不同,但是大致的流程相似因此我们就可以将相似的部分抽取成一个接口或者一个抽象类;然后再由不同的具体实现类进行创建,这里推荐采用抽象类,如果是接口我们需要实现接口中的每一种方法,这就导致如果是建造别墅可能会由打造泳池这个操作,但是其他的房子并没有操作,所以我们其他的房子实现类是没有必要去实现这个过程的所以这里采用了抽象类进行实现;

按照我们的分工,我们是采用了HouseBuilder进行指挥者与建造者的隔离,这样就可以让指挥者创建不同的房子,同时在我们需要拓展的时候也仅仅需要继续创建一个实现类就好了;

这个过程其实真的有点类似于现实生活中的场景,每个人都有自己明确的分工,指挥者就相当于设计师,而HouseBuilder可以看作是一个建设局胡总和外包,具体的Builder是具体的项目负责团队,而你就是这个需求者,在这里我们称之为Client;

最终我们根据此种依赖关系传简最终的UML类图来设计我们的代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

我们最终的目标就是获取House这个产品;

创建者模式:

创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使 得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

使用场景

隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果

多个部件都可以装配到一个对象中,但产生的运行结果不相同

产品类非常复杂或者产品类因为调用顺序不同而产生不同作用

初始化一个对象时,参数过多,或者很多参数具有默认值

Builder模式不适合创建差异性很大的产品类
产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本

需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

主要作用
  1. 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
  2. 用户只需要给出指定复杂对象的类型和内容;
  3. 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

例如:

  1. 工厂(建造者模式):负责制造汽车(组装过>程和细节在工厂内)
  2. 汽车购买者(用户):你只需要说出你需要的>型号(对象的类型和内容),然后直接购买就可>>以使用了

模式讲解:

  • 指挥者(Director)直接和客户(Client)进行需求沟通;
  • 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
  • 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
  • 各个具体建造者负责进行产品部件的构建;
  • 最终构建成具体产品(Product)。

那现在我们就开始创建我们的房子吧:

首先我们创建一个抽象类:

public abstract class HouseBuilder(){
    private  House house = new House();

    public abstract void buildBasic();

    public abstract void buildWalls();

    public abstract void roofed();

    public abstract House build();
}

CommonHouse:

public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("普通房子地基只需要两米即可");
    }

    @Override
    public void buildWalls() {
        System.out.println("采用白色墙体");
    }

    @Override
    public void roofed() {
        System.out.println("采用琉璃瓦进行封顶");
    }

    @Override
    public House build() {
        return new House();
    }

    @Override
    public void createPool() {
        System.out.println("此栋房子没有配备此种设置");
    }
}

HighHouse:

public class HighBuilding extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("普通房子地基只需要50米即可");
    }

    @Override
    public void buildWalls() {
        System.out.println("采用玻璃墙体");
    }

    @Override
    public void roofed() {
        System.out.println("采用空中花园进行封顶");
    }

    @Override
    public House build() {
        return new House();
    }

    @Override
    public void createPool() {
        System.out.println("无边际泳池");
    }
}

HouseDirect:

/**
 * @author wyp867322
 * @version 1.0
 * @date 2020/7/6 1:13
 */
public class HouseDirector {

    private HouseBuilder houseBuilder;

    public HouseBuilder getHouseBuilder() {
        return houseBuilder;
    }

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House createHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.build();
    }
}

Client:

public class Client {
    public static void main(String[] args) {
        HouseDirector houseDirector = new HouseDirector();
        HouseBuilder houseBuilder = new CommonHouse();
        houseDirector.setHouseBuilder(houseBuilder);
        House house = houseDirector.createHouse();
        System.out.println(house);
    }
}
成品
普通住房
共同特征
高楼大厦
别墅
指挥者
需求者
成品

结合图像来看,具体的建造细节(每一步需要做什么)由实体类完成,指挥者仅仅安排建造的过程(不同的房子需要怎么做)最终在指挥者这里获得成品提供给需求者完成创建;

}
}


```mermaid
graph LR
A[普通住房]-->B[共同特征]
C[高楼大厦]-->B
D[别墅]-->B
B-->E[指挥者]
E-->|成品|F[需求者]
G[成品]-->E

结合图像来看,具体的建造细节(每一步需要做什么)由实体类完成,指挥者仅仅安排建造的过程(不同的房子需要怎么做)最终在指挥者这里获得成品提供给需求者完成创建;

本教程为授权出品教程1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括:设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)。2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值