设计模式的分类
我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:
- 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式系列文章传送门
什么是原型模式
原型模式是通过现有对象复制处一个新对象,而不需要通过构造器等方式来创建对象,原型模式简化了对象的创建过程,在某些特殊场景下,使用原型模式可以减少资源消耗,提高系统性能。
原型模式的组成
- 抽象原型类:声明了克隆方法的接口,是具体原型类的父类,可以是抽象类也可以是接口,也可以是具体实现类。
- 具体原型类:它实现了抽象原型类中声明的克隆方法,在克隆方法中返回自己的克隆对象。
- 客户端类:通过具体抽象原型类的克隆方法来创建对象。
原型模式实现
我们还是用车来做为验证对象。
Prototype(抽象原型类)
定义车的抽象原型类(我们这里定义的是接口),代码如下:
public interface Prototype extends Cloneable{
//克隆对象的方法
Prototype clone();
}
此处的 Cloneable 接口是一个标记接口,表示该类可以被克隆。
我们这里继承 Cloneable 接口使用的是浅拷贝,还有一种克隆模式叫做深拷贝,浅拷贝只会拷贝对象的基本数据类型和其他对象的引用,而不会递归地复制引用对象本身。深拷贝会递归地复制整个对象,确保克隆对象与原对象相互完全独立,想要需要实现深拷贝,需要手动编写代码来处理对象中的引用类型属性。
CarPrototype(具体原型类)
定义具体的原型类,代码如下:
public class CarPrototype implements Prototype {
//座椅
private String seat;
//车轮
private String wheel;
//车载音响
private String carAudio;
public CarPrototype(String seat, String wheel, String carAudio) {
this.seat = seat;
this.wheel = wheel;
this.carAudio = carAudio;
}
@Override
public CarPrototype clone() {
try {
return (CarPrototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getCarAudio() {
return carAudio;
}
public void setCarAudio(String carAudio) {
this.carAudio = carAudio;
}
@Override
public String toString() {
return "CarPrototype{" +
"seat='" + seat + '\'' +
", wheel='" + wheel + '\'' +
", carAudio='" + carAudio + '\'' +
'}';
}
}
ClientCar(客户端类)
使用客户端类来调用具体的抽象原型类来创建对象,代码如下:
public class ClientCar {
public static void main(String[] args) {
//创建原型 car
CarPrototype carPrototype = new CarPrototype("一汽富维","万向钱潮","瑞声科技");
System.out.println(carPrototype);
//克隆car
CarPrototype cloneCarPrototype = carPrototype.clone();
System.out.println(cloneCarPrototype);
}
}
执行客户端代码如下:
CarPrototype{seat='一汽富维', wheel='万向钱潮', carAudio='瑞声科技'}
CarPrototype{seat='一汽富维', wheel='万向钱潮', carAudio='瑞声科技'}
可以看到我们没有使用任何构造方法就创建出了第二个对象。
原型模式的优缺点
优点:
- 可以快速创建对象,简化了对象的创建过程,提高了对象创建的效率。
- 可以对外隐藏对象创建和初始化的过程。
缺点:
- 需要给被克隆的对象增加一个抽象原型类,增加了代码量和复杂度。
- 不是所有的对象都可以进行克隆。
应用场景
- 对象创建成本高的场景,使用原型模式来复制对象可以快速的创建对象。
- 对象创建过程复杂的场景,使用原型模式来复制对象可以简化对象的创建步骤,快速的创建对象。
总结:原型模式相比工厂模式、抽象工厂模式、建造者模式会比较好理解一点,个人觉得原型模式甚至可以粗暴的理解为“复制模式”,就是封装了对象的复制方法,以此来快速创建对象。
如有不正确的地方欢迎各位指出纠正。