愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
目录
第1集 创建型设计模式-Prototype原型设计模式实战《上》
第2集 创建型设计模式-Prototype原型设计模式实战《下》
第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<String> list = new ArrayList<>();
public List<String> getList() {
return list;
}
public void setList(List<String> 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的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐
-
电脑有低配、高配,组装需要CPU、内存、电源、硬盘、主板等
-
核心组成
- 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(不完全一样,思想一样)
-
建造者模式与抽象工厂模式的比较:
- 建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族