十九、原型模式—通过复制生产实例 #和设计模式一起旅行#[通俗易懂]

拔一根猴毛,变出十万个孙悟空故事背景在java中,我们一般创建实例的时候可以使用了new 关键词指定类名来生成类的实例。例如:Preson p = new Person();或者Person p = Person.getInstance();但是是在实际开发过程中,有时候会有“不指定类名的前提下生成实例”的需求。这种情况下,就不能通过上面的这种方式生成实例!…

大家好,又见面了,我是全栈君。

拔一根猴毛,变出十万个孙悟空

故事背景

在java中,我们一般创建实例的时候可以使用了new 关键词指定类名来生成类的实例。例如:

Preson p = new Person(); 或者 Person p = Person.getInstance(); 

但是是在实际开发过程中,有时候会有“不指定类名的前提下生成实例”的需求。这种情况下,就不能通过上面的这种方式生成实例!

除了上面这种情况外,还有就是 对象的种类繁多,如果每一个都作为一个类,那么要编写很多类文件!

可以通过一个原型对象克隆出多个一模一样的对象!

原型模式和单例模式区别:
单例模式:在系统只存在或者说只创建唯一的一个对象。
原型模式:在系统中存在或者说创建多个对象。

故事主角

原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式类图

  • Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。

  • ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。

  • Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

原型模式的核心在于如何实现克隆方法,下种在Java语言中常用的克隆实现方法:

  • Java语言提供的clone()方法(浅拷贝)
  • Java语言提供的序列化方法(深拷贝)

武功修炼

使用原型管理器 演示简单的原型模式:

// 抽象原型类
public interface Product extends Cloneable{ 
   
    /** * 产品使用方法 * @param str */
    abstract void use(String str);

    /** * 复制实例对象的方法 * @return */
    abstract Product createClone();
}
public class MessageProduct implements Product{ 
   

    private String flagStr;

    public  MessageProduct(){}

    public  MessageProduct(String str){
        this.flagStr = str;
    }

    @Override
    public void use(String str) {
        for (int i = 0; i < str.length(); i++) {
            System.out.print(flagStr);

        }

        System.out.println("");
        System.out.println("-----"+ str+"---------");

        for (int i = 0; i < str.length(); i++) {
            System.out.print(flagStr);

        }
    }

    @Override
    public Product createClone() {
        Product product = null;

        try {
            product = (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return product;
    }
}
public class UnderLineProduct implements Product { 
   

    private String flagStr;

    public  UnderLineProduct(){}

    public  UnderLineProduct(String str){
        this.flagStr = str;
    }

    @Override
    public void use(String str) {

        for (int i = 0; i < str.length(); i++) {
            System.out.print(flagStr);

        }

        System.out.println("");

        System.out.println(str);

        for (int i = 0; i < str.length(); i++) {
            System.out.print(flagStr);

        }
        System.out.println("");
    }

    @Override
    public Product createClone() {
        Product product = null;

        try {
            product = (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return product;
    }

}
// Product 的管理器
public class ManageProduct { 
   

    private HashMap map = new HashMap();

    /** * 通过名称注册Product * @param name * @param product */
    public void register(String name,Product product){
        map.put(name, product);
    }

    /** * 创建Product * @param protoName * @return */
    public Product createProduct(String protoName){
        Product product = (Product)map.get(protoName);

        return product.createClone();
    }

public class TestMain { 
   

    public static void main(String[] args) {

        ManageProduct manageProduct = new ManageProduct();

        // 准备
        manageProduct.register("mesOne",new UnderLineProduct("|"));
        manageProduct.register("mesTwo",new UnderLineProduct("——"));
        manageProduct.register("mesThree",new MessageProduct("(*)"));

        //生成

        Product p1 = manageProduct.createProduct("mesOne");
        p1.use("你好,China!");
        Product p2 = manageProduct.createProduct("mesTwo");
        p2.use("你好,China!");
        Product p3 = manageProduct.createProduct("mesThree");
        p3.use("你好,China!");


    }
}


|||||||||
你好,China!
|||||||||
——————————————————
你好,China!
——————————————————
(*)(*)(*)(*)(*)(*)(*)(*)(*)
-----你好,China!---------
(*)(*)(*)(*)(*)(*)(*)(*)(*)

总结

优点:

  • 原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
  • 在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少产品类对原有系统都没有任何影响。

缺点:

  • 需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。

  • 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦。

参考

本专栏文章列表

一、设计模式-开篇—为什么我要去旅行? #和设计模式一起旅行#
二、设计模式-必要的基础知识—旅行前的准备 #和设计模式一起旅行#
三、设计模式介绍—她是谁,我们要去哪里? #和设计模式一起旅行#
四、单例模式—不要冒充我,我只有一个! #和设计模式一起旅行#
五、工厂模式—旅行的钱怎么来 #和设计模式一起旅行#
六、策略模式—旅行的交通工具 #和设计模式一起旅行#
七、观察者模式——关注我,分享旅途最浪漫的瞬间! #和设计模式一起旅行#
八、装饰者模式—巴厘岛,奶茶店的困扰! #和设计模式一起旅行#
九、命令模式—使用命令控制奶茶店中酷炫的灯 #和设计模式一起旅行#
十、模板方法模式—制作更多好喝的饮品! #和设计模式一起旅行#
十一、代理模式 —专注,做最好的自己!#和设计模式一起旅行#
十二、适配器模式——解决充电的烦恼 #和设计模式一起旅行#
十三、外观模式—— 简化接口 #和设计模式一起旅行#
十四、迭代器模式—— 一个一个的遍历 #和设计模式一起旅行#
十五、组合模式—— 容器与内容的一致性 #和设计模式一起旅行#
十六、状态模式—用类表示状态 #和设计模式一起旅行#
十七、访问者模式-访问数据结构并处理数据 #和设计模式一起旅行#
十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#
十九、原型模式—通过复制生产实例 #和设计模式一起旅行#
二十、设计模式总结—后会有期 #和设计模式一起旅行#


如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到,谢谢!

如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121076.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java设计模式3,里氏替换原则

    java设计模式3,里氏替换原则里氏替换原则的内容可以描述为:“派生类(子类)对象可以在程序中代替其基类(超类)对象。”

    2022年10月29日
    0
  • 软件架构与设计模式_软件架构设计

    软件架构与设计模式_软件架构设计什么是架构?软件体系结构通常被称为架构,指可以预制和可重构的软件框架结构。架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度的视点也会造成软件体系结构的不同理解,以下是一些主流的标准观点。ANSI/IEEE610.12-1990软件工程标准词汇对于体系结构定义是:“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组…

    2022年8月31日
    1
  • 代理设计模式详解(java版本)

    代理设计模式详解(java版本)

    2021年8月2日
    55
  • 设计模式之代理模式XXOO

    设计模式之代理模式XXOO定义代理模式可以分为两种,一种是静态代理,一种是动态代理。静态代理:代理类一般会持有一个被代理的对象引用,且对于不关心的方法全部委托给被代理的对象处理。自己处理关心的方法。这种代理方式是死板的,它不是在运行时动态创建,它就是硬编码,你代码编译前写的是什么,编译后就是什么。换句话就是你按下CTRL+S的那一刻,就会被代理对象生成一个不可动态改变的代理类。静态代理一般对于代理的对象是单个或者多个固定的类(数量不会太多)使用。效果会比动态代理要好。动态代理:动态代理又分为JDK动

    2022年7月17日
    10
  • 设计模式之原型(prototype)模式

    相信大多数的人都看过《西游记》,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉。孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式中也有一个类似的模式,我们可以通过一个原

    2021年12月28日
    39
  • 我的Java设计模式-原型模式

    我的Java设计模式-原型模式

    2022年3月7日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号