「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
一、什么是原型模式
原型模式:通过原型创建对象。用于创建重复的对象,是一种创建型设计模式。举个栗子:以商品为例子,抽象的商品,一些商品都有类似的参数,比如颜色,大小,价格等。实现抽象商品,作为不同商品的原型,此时可以直接通过商品原型创建对象。由于有多个商品原型,我们把商品原型管理起来,比如放到一个Map中,使用的时候在通过名字获取对应的原型(如果仅仅有一种原型,不需要管理)。
二、原型模式的实现
@Data
public abstract class Goods implements Cloneable{
protected String color;
protected String size;
protected Integer price;
/**
* 原型id
*/
private Integer id;
@Override
public Goods clone() {
try {
Goods clone = (Goods) super.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
抽象原型商品
public class GoodsA extends Goods{
public GoodsA(){
color = "red";
size="big";
price = 1;
}
}
原型商品A
public class GoodsB extends Goods{
public GoodsB(){
color = "white";
size="small";
price = 2;
}
}
原型商品B
public class PrototypeManager {
private static Map<Integer,Goods> map = new HashMap<>();
public static Goods getGoods(Integer prototypeId){
Goods goods = map.get(prototypeId);
if (goods==null){
throw new RuntimeException("原型不存在");
}
return goods.clone();
}
public static void loadPrototype(){
GoodsA goodsA = new GoodsA();
goodsA.setId(1);
map.put(goodsA.getId(),goodsA);
GoodsB goodsB = new GoodsB();
goodsB.setId(2);
map.put(goodsB.getId(),goodsB);
}
}
原型管理,在多个原型时,用于管理原型。
public class PrototypeTest {
public static void main(String[] args) {
PrototypeManager.loadPrototype();
Goods goodA = PrototypeManager.getGoods(1);
System.out.println(goodA);
Goods goodB = PrototypeManager.getGoods(2);
System.out.println(goodB);
}
}
这里原型管理先加载了原型,然后获取原型创建对象。也可以换一种方式,用户自己创建商品,可以选择是否作为原型放到原型管理中,然后在需要的时候获取对应原型,通过原型创建对象。
三、总结
原型模式和工厂模式的区别:
抽象工厂模式是按照一系列的产品构建的,比如有一个抽象键鼠工厂,A工厂实现了抽象键鼠工厂,通过A工厂获得键盘A和鼠标A。但我们有可能不会使用同一系列的键盘和鼠标,比如我想鼠标A和键盘B组合。这个时候我使用工厂模式是不是就不够灵活。
原型模式是把之前由工厂构建对象的方式改成对象自身调用clone方法的方式,创建速度更快。这边如果有鼠标A的原型和键盘B的原型,直接通过原型创建对象,完成键鼠套装的创建。
总体而言,原型模式应该比较容易理解,真正的难点应该在于理解它和工厂模式的区别上。
如有不对,请大佬多多指证。