小滴课堂-学习笔记:(5)创建型设计模式 建造者+原型模式的应用场景

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

目录

第1集 创建型设计模式-Prototype原型设计模式实战《上》

第2集 创建型设计模式-Prototype原型设计模式实战《下》

第3集 创建型设计模式-建造者模式应用介绍《上》

第4集 创建型设计模式-建造者模式应用介绍《下》

干货文档


 

 

第1集 创建型设计模式-Prototype原型设计模式实战《上》

简介:讲解原型设计模式介绍和应用场景《上》

  • 原型设计模式Prototype

    • 是一种对象创建型模式,使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,主要用于创建重复的对象,同时又能保证性能
    • 工作原理是将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程
    • 应该是最简单的设计模式了,实现一个接口,重写一个方法即完成了原型模式

 

  • 核心组成

    • Prototype: 声明克隆方法的接口,是所有具体原型类的公共父类,Cloneable接口
    • ConcretePrototype : 具体原型类
    • Client: 让一个原型对象克隆自身从而创建一个新的对象

 

  • 应用场景

    • 创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得
    • 如果系统要保存对象的状态,做备份使用

 

 

 

 

 

 

 

 

 

第2集 创建型设计模式-Prototype原型设计模式实战《下》

简介:讲解原型设计模式介绍和应用场景《下》

  • 遗留问题:

    • 通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的

    • 浅拷贝实现 Cloneable,深拷贝是通过实现 Serializable 读取二进制流

    • 拓展

      • 浅拷贝
      
      
      
      如果原型对象的成员变量是基本数据类型(int、double、byte、boolean、char等),将复制一份给克隆对象;
      如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址
      ​
      通过覆盖Object类的clone()方法可以实现浅克隆
      • 深拷贝
       

       

       
      无论原型对象的成员变量是基本数据类型还是引用类型,都将复制一份给克隆对象,如果需要实现深克隆,可以通过序列化(Serializable)等方式来实现
      • 原型模式是内存二进制流的拷贝,比new对象性能高很多,使用的时候记得注意是选择浅拷贝还是深拷贝
  • 优点

    • 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,可以提高新实例的创建效率
    • 可辅助实现撤销操作,使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用恢复到历史状态

 

  • 缺点

    • 需要为每一个类配备一个克隆方法,对已有的类进行改造时,需要修改源代码,违背了“开闭原则”
    • 在实现深克隆时需要编写较为复杂的代码,且当对象之间存在多重的嵌套引用时,需要对每一层对象对应的类都必须支持深克隆
 


public class Person implements Cloneable, Serializable {
​
    private String name;
​
    private int age;
​
    private List list = new ArrayList<>();
​
​
    public List getList() {
        return list;
    }
​
    public void setList(List list) {
        this.list = list;
    }
​
    public Person() {
        System.out.println("构造函数调用");
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    @Override
    protected Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();
    }
​
    /**
     * 深拷贝
     * @return
     */
    public Object deepClone() {
​
        try {
            //输出 序列化
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);
​
            //输入 反序列化
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            Person copyObj = (Person) ois.readObject();
​
            return copyObj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
​
}








 

第3集 创建型设计模式-建造者模式应用介绍《上》

简介:讲解建造者模式介绍和应用场景《上》

  • 建造者模式(Builder Pattern)

    • 使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

    • 允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节

       

  • 场景举例

    • KFC创建套餐:套餐是一个复杂对象,它一般包含主食如汉堡、烤翅等和饮料 如果汁、 可乐等组成部分,不同的套餐有不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐

    timg

    • 电脑有低配、高配,组装需要CPU、内存、电源、硬盘、主板等

      小滴课堂-学习笔记:(5)创建型设计模式 建造者+原型模式的应用场景_第1张图片

  • 核心组成

    • Builder:抽象建造者,定义多个通用方法和构建方法
    • ConcreteBuilder:具体建造者,可以有多个
    • Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
    • Product:产品角色

 

 

 

 

 

 

 

 

 

 

第4集 创建型设计模式-建造者模式应用介绍《下》

简介:讲解建造者模式介绍和应用场景《下》

  • 编码实践(同个设计模式 包括博文、书籍等不会完全相同,大体思想一致就行)



/**
 * 声明了建造者的公共方法
 */
public interface Builder {
​
    /**
     *细节方法
     */
    void buildCpu();
​
    void buildMainboard();
​
    void buildDisk();
​
    void buildPower();
​
    void buildMemory();
​
    Computer createComputer();
​
}
​
​
/**
 * 小滴课堂,愿景:让技术不再难学
 *
 * @Description 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
 *               Director是全程指导组装过程,具体的细节还是builder去操作
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群 微信:  xdclass6
 * @Version 1.0
 **/
​
public class Director {
​
    public Computer craete(Builder builder){
​
        builder.buildMemory();
        builder.buildCpu();
        builder.buildMainboard();
        builder.buildDisk();
        builder.buildPower();
​
        return builder.createComputer();
​
    }
​
}
​
​
​
​
public class HighComputerBuilder implements Builder{
​
    private Computer computer = new Computer();
​
    @Override
    public void buildCpu() {
        computer.setCpu("高配 CPU");
    }
​
    @Override
    public void buildMainboard() {
        computer.setMainboard("高配 主板");
    }
​
    @Override
    public void buildDisk() {
        computer.setDisk("高配 磁盘");
    }
​
    @Override
    public void buildPower() {
        computer.setPower("高配 电源");
    }
​
    @Override
    public void buildMemory() {
        computer.setMemory("高配 内存");
    }
​
    @Override
    public Computer createComputer() {
        return computer;
    }
}
​

 

  • 优点

    • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
    • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
    • 增加新的具体建造者无须修改原有类库的代码,符合开闭原则
    • 建造者模式结合链式编程来使用,代码上更加美观
  • 缺点

    • 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用

     

  • JDK里面的应用

    • tcp传输协议 protobuf 生成的api、java中的StringBuilder(不完全一样,思想一样)

     

  • 建造者模式与抽象工厂模式的比较:

    • 建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族

 

 

干货文档

你可能感兴趣的:(JAVA,视频教程,面试,设计模式,java,编程语言,python,后端)