懒羊羊学设计模式-创建者模式

简介: 懒羊羊学设计模式-创建者模式

😎创建者模式

定义

当我们需要实列化一个复杂的类,以得到不同结构类型和不同的内部状态的对象时,我们可以用不同的类对它们的实列化操作逻辑分别进行封装,这些类我们就称之为建造者。

当我们需要来之同一个类,但是要就有不同结构对象时,就可以通过构造另一个建造者来进行实列化。

----------摘自《设计模式之美》。

角色

产品类:Product 我们具体需要生成的类对象

抽象建造者类:Builder 为我们需要生成的类对象,构建不同的模块属性,即:公开构建产品类的属性,隐藏产品类的其他功能

具体建造者类: ConcreteBuilder 实现我们要生成的类对象

导演类: Director 确定构建我们的类对象具体有哪些模块属性

举个荔枝

📢简单举个荔枝哈

🎨 话说有一天,我们的懒羊羊接到了慢羊羊下发的一个Java开发任务:定义一个手机类,创建出对象,并实例化

懒羊羊:小小投个懒吧☺,说罢便分分钟写完代码

懒羊羊:哈哈,我先定义一个Phone类,浅浅定义几个属性,然后再Client类中set一下就好啦,分分钟搞定

Phone.java

@Data
@Getter
@Setter
public class Phone{
    //运行内存 单位GB ps:为了简写就没有用doc注释
    private Integer ram;
    //机身内存 单位GB
    private Integer rom;
    //CPU型号
    private String typeCPU;
}

Client.java

public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.setRam(6);
        phone.setRom(64);
        phone.setTypeCPU("骁龙888");
        System.out.println("phone = " + phone);
    }
}

懒羊羊:来我们运行看结果🍿

懒羊羊:村长,我写好啦

慢羊羊:这么快就写好啦? 几秒钟后~ ,你这啥玩意啊? 你是想让我去买手机时,还要让我自己动手组装?万一我组装错了不就废了吗,而且你这很明显违反了羊村定的一个最少知道法则啊,重做😠

【Tips】

当一个对象的组成过程特别繁琐,特别麻烦的时候,就不应该让客户端自己来完成

这样客户端可能会不按正确步骤组装对象,或缺少了某一个组件。

违反了迪米特法则

懒羊羊:可是,可是~~,我不知道怎么做了吖,村长,给个提示呗😊

慢羊羊:你是真的懒,这样吧,我告诉你个方法,你浅学一下创建者模式,再写一写

【One Hour Later】

懒羊羊:哈哈,我学会了,我再写个PhoneBuilder类就好了,在里面定义个build方法,然后在build方法里组装就好了,然后再简单改一下Client类就好啦,真棒😎

PhoneBuilder.java

public class PhoneBulider {
    //关联手机 ps:为了简单,直接这么写的
    private Phone phone = new Phone();
    public Phone build(){
        phone.setRam(12);
        phone.setRom(64);
        phone.setTypeCPU("骁龙886");
        return phone;
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        PhoneBulider phoneBulider = new PhoneBulider();
        Phone build = phoneBulider.build();
        System.out.println("build = " + build);
    }
}

懒羊羊:村长,村长,我又写完啦,快看看😎

慢羊羊:嗯,这下是写好了,但是吧 ,我想要高端一点的手机怎么办,或者我也要低端一点的

懒羊羊:这好办,稍等~

慢羊羊:你这合适吗,高端机和低端机一样的配置?🤪

【Tips】

封装地太狠, 客户端没办法选择配置, 都是由服务器端写好的的配置

懒羊羊:那好吧,我定义个HightLevelPhoneBulider类MidLevelPhoneBulider类分别处理就好啦

HightLevelPhoneBulider

public class HightLevelPhoneBulider {
    //关联手机 ps:为了简单,直接这么写的
    private Phone phone = new Phone();
    public Phone build(){
        phone.setRam(24);
        phone.setRom(512);
        phone.setTypeCPU("骁龙888");
        return phone;
    }
}

MidLevelPhoneBulider

/**
 * @Author tiancx
 * @create 2023/4/9 11:08
 */
public class MidLevelPhoneBulider {
    //关联手机 ps:为了简单,直接这么写的
    private Phone phone = new Phone();
    public Phone build(){
        phone.setRam(12);
        phone.setRom(256);
        phone.setTypeCPU("骁龙886");
        return phone;
    }
}

客户端代码如下

结果在这里~

懒羊羊:村长,我又又写好啦,快看😎

慢羊羊:嗯,这下感觉还不错,不够为啥我感觉你高端机和中端机的组装过程很像啊? 你重复操作的话,一不小心漏了某个步骤可咋办?

【Tips】

无论哪种配置的手机,配置过程都是一样的,只是细节不同,有重复

而且在重复的步骤中,某个建造者可能会漏了某个步骤,也不会报错,但是是不符合要求的

懒羊羊:我知道了,上次喜羊羊说过,这种可以抽象一下,稍等片刻

懒羊羊:我定义一个PhoneBuilder接口,抽象一下就好了,然后让具体的创建者重写一下就好了

PhoneBuilder

public interface PhoneBuilder {
    void buildRam();
    void buildRom();
    void buildTypeCPU();
    Phone build();
}

HightLevelPhoneBulider

public class HightLevelPhoneBulider implements PhoneBuilder{
    //关联手机 ps:为了简单,直接这么写的
    private Phone phone = new Phone();
    @Override
    public Phone build(){
        return phone;
    }
    @Override
    public void buildRam() {
        phone.setRam(24);
    }
    @Override
    public void buildRom() {
        phone.setRom(512);
    }
    @Override
    public void buildTypeCPU() {
        phone.setTypeCPU("骁龙888");
    }
}

MidLevelPhoneBulider

public class MidLevelPhoneBulider implements PhoneBuilder{
    //关联手机 ps:为了简单,直接这么写的
    private Phone phone = new Phone();
    @Override
    public Phone build(){
        return phone;
    }
    @Override
    public void buildRam() {
        phone.setRam(12);
    }
    @Override
    public void buildRom() {
        phone.setRom(256);
    }
    @Override
    public void buildTypeCPU() {
        phone.setTypeCPU("骁龙886");
    }
}

客户端代码

运行看下结果

懒羊羊:村长,看,我这次抽象了一下,怎么样啊😋

慢羊羊:可以,不过你这个,怎么感觉又要我自己组装了啊🙄

懒羊羊:啊这,让我想想怎么办~

懒羊羊:咦,既然不能在客户端封装,那我创建个指挥者来弄吧,真聪明😂

Director

public class Director {
    public Phone build(PhoneBuilder builder){
        builder.buildRam();
        builder.buildRom();
        builder.buildTypeCPU();
        return builder.build();
    }
}

然后小改一下客户端代码

懒羊羊:村长,这下好了吧,嘻嘻😎

慢羊羊:阔以,差不多算可以了吧,但是还没有结束额🍋

懒羊羊:什么?还没结束?

慢羊羊:行吧,行吧,今天辛苦你了,下次再来🍖

🍗模式类图

懒羊羊:休息了一会,我来把刚刚的类图画一下吧

🧂优缺点

懒羊羊:我们在顺带说一下优缺点吧:

优点:

  • 可以**隔离复杂对象的构建过程**,使得构建过程可以独立于表示方式进行变化;
  • 可以更加灵活地创建对象,通过更换不同的具体构建者来创建不同的对象
  • 可以使得构建过程更加清晰和易于理解,增加代码的可维护性和可扩展性。

缺点:

  • 可能会增加代码的复杂性,使得代码更难以理解和维护;
  • 可能会**增加代码的开销**,使得代码的性能变差;
  • 可能会降低代码的可读性,使得代码变得更加难以理解。

🍕适用环境

  • 当需要动态地创建对象或者通过配置来创建对象时,可以使用创建者模式;
  • 当需要创建的对象比较复杂,包含多个组成部分,而且构建顺序不固定时,可以使用创建者模式;
  • 当需要对创建过程进行精细化控制时,可以使用创建者模式。


相关文章
|
6月前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
45 2
|
6月前
|
设计模式 安全 Java
设计模式学习心得之五种创建者模式(1)
设计模式学习心得之五种创建者模式(1)
40 0
|
设计模式 存储 安全
【设计模式】五种创建者模式
创建者模式 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。 创建型模式分为: 单例模式 工厂方法模式 抽象工程模式 原型模式 建造者模式 单例设计模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 单例模式的结构 单例模式的
69 0
|
设计模式 安全 Java
设计模式-创建者模式总结
创建者模式的特点及使用场景 《Effective Java》—— 创建与销毁对象 一章中有写道:当一个类中有大量的构造参数时,静态方法和构造器已经不能满足对象的实例化,那么我们将考虑构建器。
811 0
|
28天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
24天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
37 1