创建型模式 | 原型模式解析及应用

一、介绍

定义:
原型模式(Prototype Pattern)用于创建重复的对象。实现一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

二、特点

原型模式作为一种快速创建大量相同或相似的对象方式,很多软件的CTRL+C和CTRL+V操作的就是原型模式应用。

优点:

  • 当创建新的对象实例较为复杂时,可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。
  • 深度克隆可以来保存对象的状态,使用原型模式进行复制。当需要恢复到某一时刻就直接跳到。比如我们的idea的历史版本

缺点:

  • 需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的里面,当对已有的类经行改造时需要修改源代码,违背了开闭原则。
  • 在实现深克隆的时需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用的时候,每一层对象对应的类都必须实现深克隆,过于繁琐

三、使用场景

  • 在需要一个类的大量对象的时候,使用原型模式是最佳选择,使用原型模式比直接new这个对象性能要好。
  • 如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算,那么可以使用原型模式。

四、类图与角色

UML图:
在这里插入图片描述
角色:

Prototype:抽象原型类
ConcretePrototype:具体原型类
Client:客户类

五、实战代码

实现一个水果商店的货架,可以将原型放到货架上,客户在货架上取水果,取的都是原型的克隆对象。

【Apple.java】

public class Apple extends MyFruit{
    public Apple (){
        kind = "Apple";
    }
}

【Banana .java】

public class Banana extends MyFruit{
    public Banana(){
        kind = "Banana";
    }
}

【MyFruit .java】

public class MyFruit implements  Cloneable{
    protected  String kind;

    public void Display(){
        System.out.println(kind);
    }

    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

【MyFruitStore .java】

import java.util.Hashtable;

public class MyFruitStore {
    //水果架    Hashtable里面放了很多原型,像一个池子一样
    private static Hashtable fruittable=new Hashtable<Integer,MyFruit>();
    public static void Add(Integer key, MyFruit fruit){
       //将水果放到货架上
        fruittable.put(key,fruit);
    }

    //从货架上取,通过货架号取
    public static MyFruit Get(Integer key) throws CloneNotSupportedException {
        MyFruit fruit = (MyFruit) fruittable.get(key); //get出来的是Object类型,需要强制转换
        return (MyFruit) fruit.clone();  //不能真把水果拿出去了,否则货架上就没有了,拿得是clone
    }
}

【Client .java】

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        MyFruit fruit1 = new Apple();
        MyFruit fruit2 = new Banana();
        //MyFruitStore里面相当于放了很多原型

        MyFruitStore.Add(1,fruit1);
        MyFruitStore.Add(2,fruit2);
        MyFruitStore.Add(3,new Apple());
        MyFruitStore.Add(4,new Banana());

        //开发的时候上面的代码一般用的时候启动的时候就都初始化了
        //用的时候直接去取
        MyFruit f1= (MyFruit) MyFruitStore.Get(3);
        f1.Display();
        MyFruit f2 = (MyFruit) MyFruitStore.Get(4);
        f2.Display();
    }
}

【运行截图】

在这里插入图片描述


喜欢的话记得点赞收藏哟😊
Java设计模式—博文专栏持续更新!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雄不是大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值