飞道的博客

创建型模式—原型模式

496人阅读  评论(0)

一、介绍

定义:
原型模式(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();
    }
}

运行截图:


转载:https://blog.csdn.net/Da_Xiong000/article/details/105847156
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场