原型模式浅谈

279 阅读2分钟

「这是我参与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);
    }
}

这里原型管理先加载了原型,然后获取原型创建对象。也可以换一种方式,用户自己创建商品,可以选择是否作为原型放到原型管理中,然后在需要的时候获取对应原型,通过原型创建对象。 image.png

三、总结

原型模式和工厂模式的区别:

抽象工厂模式是按照一系列的产品构建的,比如有一个抽象键鼠工厂,A工厂实现了抽象键鼠工厂,通过A工厂获得键盘A和鼠标A。但我们有可能不会使用同一系列的键盘和鼠标,比如我想鼠标A和键盘B组合。这个时候我使用工厂模式是不是就不够灵活。

原型模式是把之前由工厂构建对象的方式改成对象自身调用clone方法的方式,创建速度更快。这边如果有鼠标A的原型和键盘B的原型,直接通过原型创建对象,完成键鼠套装的创建。

总体而言,原型模式应该比较容易理解,真正的难点应该在于理解它和工厂模式的区别上。

如有不对,请大佬多多指证。