欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式:原型模式

程序员文章站 2022-06-12 20:22:53
...

设计模式:原型模式

  • 原型模式简介
    1. 原型模式是一种创建型的模式,是用于创建重复的对象,同时又能保证性能。
    2. 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象(浅拷贝和深拷贝)
    3. 主要解决:在运行期建立和删除原型
    4. 使用场景:
      1. 当一个系统应该独立于它的产品创建,构成和表示时
      2. 当要实例化的类是在运行时刻指定时,例如通过动态装载。
      3. 为了避免创建一个与产品类层次平行的工厂类层次时。
      4. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便
  • 原型模式成分
    1. 原型角色
      1. 实现Cloneable接口
      2. 实现clone方法
    2. 原型角色实现
      1. 实现用于复制现有实例来生成新实例的方法
    3. 使用者角色:
      1. 包含一个注册表,里面放着原型角色的实现类对象。并提供一个找出正确实例原型的方法。并且返回原型角色实现的方法
  • 原型模式优缺点
    1. 优点:
      1. 性能高
      2. 避免构造函数的约束
    2. 缺点:
      1. 必须实现Cloneable接口
      2. 匹配克隆方法需要对垒的功能进行通盘考虑,对于全新的类没有问题,但是对于已有的类不一定容易,特别当一个类引用不支持串行化的简介对象
  • 原型模式实现
    1. 原型角色:
      package com.fg.java.prototype;
      
      /**
       * 原型模式:原型角色 定义用于复制现有实例来生成实例的方法
       * 实现接口 Cloneable;
       */
      public abstract class Person implements Cloneable{
          private String name;
          private String  sex;
          abstract void sayInfo();
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getSex() {
              return sex;
          }
      
          public void setSex(String sex) {
              this.sex = sex;
          }
      
          @Override
          protected Object clone() {
              Object clone = null;
              try{
                  clone = super.clone();
              }catch (CloneNotSupportedException e){
                  e.printStackTrace();
              }
              return clone;
          }
      }
      

       

    2. 原型角色实现:
      package com.fg.java.prototype;
      
      public class HaoTian extends Person {
          @Override
          void sayInfo() {
              System.out.println("my name is HaoTian");
          }
      
          public HaoTian() {
              super();
          }
      }
      
      package com.fg.java.prototype;
      
      public class WangMu extends Person {
          public WangMu() {
              super();
          }
      
          @Override
          void sayInfo() {
              System.out.println("My name is WangMu");
          }
      }
      

       

    3. 原型角色使用者:
      package com.fg.java.prototype;
      
      import java.util.concurrent.ConcurrentHashMap;
      
      public class PersonCache {
          //要考虑多线程,所以不能使用HashMpa
          private static ConcurrentHashMap<String,Person>  personCache = new ConcurrentHashMap<String, Person>();
          public static Person getPerson(String name){
              Person person = personCache.get(name);
              return (Person)person.clone();
          }
      
          public static void loadCache(){
              HaoTian haoTian = new HaoTian();
              WangMu wangMu = new WangMu();
              personCache.put("HaoTian",haoTian);
              personCache.put("WangMu",wangMu);
          }
      }