设计模式——原型模式

原型模式_通过复制生成实例(避免实例重复创建从而减少内存消耗)

阅读前准备

  • 1、浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
    (如:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2中依然包含对B1的引用,
    B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2中包含对C2(C1的copy)的引用)
  • 2、深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象
    (需要重写clone方法.如

    @Override
          protected Object clone() throws CloneNotSupportedException {
            Husband husband = (Husband) super.clone();
              husband.wife = (Wife) husband.getWife().clone();
            return husband;
         }
      )
/**
 * 产品生成管理器
 * @author maikec
 * @date 2019/5/11
 */
public final class ProductManager {
    private final Map<String, Product> productMap = Collections.synchronizedMap(new HashMap<>(  ));
    public void register(Product product){
        productMap.put( product.getClass().getSimpleName(),product );
    }
    public Product create(Product product){
        Product result = productMap.get( product.getClass().getSimpleName() );
        if(null == result){
            register( product );
            result = productMap.get( product.getClass().getSimpleName() );
        }
        return result.createClone();
    }
}

/**
 * 原型类
 * @author maikec
 * @date 2019/5/11
 */
public interface Product extends Cloneable {
    void use();

    /**
     * 克隆
     * @return
     */
    Product createClone();
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class CloneFailureException extends RuntimeException {
    public CloneFailureException(){
        super("clone failure");
    }
    public CloneFailureException(String msg){
        super(msg);
    }
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class MessageProduct implements Product {
    @Override
    public void use() {
        System.out.println( "MessageProduct" );
    }

    @Override
    public MessageProduct createClone() {
        try {
            return (MessageProduct) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            throw new CloneFailureException(  );
        }
    }
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class UnderlineProduct implements Product {
    @Override
    public void use() {
        System.out.println( "UnderlineProduct" );
    }

    @Override
    public UnderlineProduct createClone() {
        try {
            return (UnderlineProduct) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            throw new CloneFailureException();
        }
    }
}

/**
 * @author maikec
 * @date 2019/5/11
 */
public class PrototypeDemo {
    public static void main(String[] args) {
        ProductManager manager = new ProductManager();
        manager.register( new UnderlineProduct() );
        manager.register( new MessageProduct() );

        manager.create(  new UnderlineProduct()  ).use();
        manager.create(  new MessageProduct()  ).use();
    }
}

附录

github.com/maikec/patt… 个人GitHub设计模式案例

声明

引用该文档请注明出处

(0)

相关推荐

  • 创建型模式————原型模式(2.3)

    什么是原型模式? 简单来说,通过复制的方式创建对象.(被复制的对象可以理解为模板) 原型模式的应用场景 复杂结构对象的创建. 复杂结构对象:可以理解为对象里面还有对象. [举个栗子]:点外卖的收货地址 ...

  • 面试官:Object有些什么方法?教你如何吊打他

    回复"000"获取大量电子书 从学Java开始,天天念叨着Object是所有类的父类,说Java是单继承,是单继承的吗? 大家所说的单继承应该是除去Object继承以外的单继承吧. ...

  • 结合JDK源码看设计模式——原型模式

    定义: 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.不需要知道任何创建的细节,不调用构造函数 适用场景: 类初始化的时候消耗较多资源 new产生的对象需要非常繁琐的过程 构造函数比 ...

  • 五分钟 掌握 原型模式 (文末送书)

    回复"000"获取程序员必备电子书 大家好,我是老田,今天我给大家分享设计模式中的原型模式.用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式. 关于设 ...

  • PHP设计模式之原型模式

    PHP设计模式之原型模式 原型模式其实更形象的来说应该叫克隆模式.它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了.说真的,从使用方式来看真的感觉叫克隆 ...

  • 所有类的父类 Java Object

    Java Object 一.什么是Java Object 二.Object类的方法 1.创建并返回一个对象的拷贝protected Object clone() 2.比较两个对象是否相等 boolea ...

  • 23种设计模式之原型模式

    原型模式 1.基本介绍 1)原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象. 2)原型模式是一种创建型设计模式,允许一个对象再创建另一个可定制的 ...

  • 设计模式-原型模式

    原型模式 ​原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,并且通过拷贝这些原型创建新的对象 ​调用者不需要知道任何创建细节,不调用构造函数 ​其属于一种创建型模式 通用类图 优点 性能 ...

  • 设计模式-原型模式详解

    一.原型模式的概念 原型模式属于创建型设计模式.当要创建的对象类型由原型实例确定时使用它,该实例被克隆以生成新对象. 此模式用于 1.避免客户端应用程序中的对象创建者的子类,如工厂方法模式. 2.避免 ...

  • [PHP小课堂]PHP设计模式之原型模式

    [PHP小课堂]PHP设计模式之原型模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 大话设计模式笔记(七)の原型模式

    举个栗子 问题描述 要求有一个简历类,必须要有姓名,可以设置性别和年龄,可以设置工作经历,最终需要三份简历. 简单实现 简历类 /** * 简历类 * Created by callmeDevil o ...

  • [js] 第109天 请描述下什么是原型模式?它主要运用在哪些场景?

    今日试题: 请描述下什么是原型模式?它主要运用在哪些场景? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己) ...

  • 设计模式-门面模式

    门面模式 参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好的设计模式 http://c.biancheng.net/view/1326.html 定义 也称为外观模式 外观模 ...