设计模式:原型模式

127 阅读2分钟

原型设计模式prototype

定义:

用一个已经创建的实例作为原型,通过复制该圆形对象来创建一个和原型相同或相似的对象。(类似于复制?

  • 原型模式的优点:
    • Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
    • 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
  • 缺点:
    • 需要为每个类配置一个clone方法
    • clone方法在类的内部,当需要修改代码时,违反了OCP原则

原型模型的结构和实现

1.模式结构

抽象原型类:规定具体原型对象必须实现的接口
具体原型类:实现抽象原型类的clone方法
访问类:使用具体原型类中的clone方法来复制新对象

image.png

2. 模式的实现

克隆分为:深克隆、浅克隆

  • 深克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
  • 浅克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

example1

      class Realizetype implements Cloneable{
        Realizetype() {
        System.out.println("具体原型创建成功");
        }
        @Override
        public Object clone() throws CloneNotSupportedException{
        System.out.println("具体原型复制成功");
        return (Realizetype) super.clone();
        }
      }
      
      public class PrototypeTest{
        public static void main(String[] args) throws CloneNotSupportedException {
        Realizetype ob1=new Realizetype();
        Realizetype ob2=(Realizetype) ob1.clone();
        System.out.println("obj1==ob2? "+(ob1==ob2));
        }
      }

example2

/**
 * @author richard
 * @date 2021年11月23日 13:45:00
 * @description 
 */
 class MonkeyKing implements  Cloneable{
    private static final long ID=234543253;
    int age;
    String city;
    String name;
    public MonkeyKing(int age, String city,String name) {
        this.age = age;
        this.city = city;
        this.name=name;
        System.out.println("孙悟空具体原型创建成功");
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void display(){
        System.out.println(name+age+city);
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        MonkeyKing mk=null;
        mk= (MonkeyKing) super.clone();
        System.out.println("复制成功");
        return mk;
    }
}

public class MonkeyKingTest{
    public static void main(String[] args) {
        MonkeyKing swk=new MonkeyKing(133,"beijing","孙悟空");
        swk.display();
        try {
            MonkeyKing copySwk=(MonkeyKing) swk.clone();
            //copySwk.setAge(1);
            //copySwk.setCity("西安");
            //如果没有给年龄和城市赋值,则copy对象的属性和原型的保持一致
            copySwk.setName("一号");
            copySwk.display();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

应用场景

  • 对象之间相同或者相似,只有个别属性不同
  • 创建对象成本比较大,如初始化时间比较长,占用较多cpu等
  • 系统大量使用该类的对象,并且每个调用者都要给他的属性重新赋值