zoukankan      html  css  js  c++  java
  • 创建型—原型模式

    1、原型模式意图:

      用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    2、场景描述:

      原型模式,利用实例自身的克隆功能来得到与原实例相同的新的实例。

      设想西游记中的一个场景,唐僧师徒四人(白龙马除外),不过,该唐僧是个多事、喜欢使唤徒弟的唐僧。每当有事时,唐僧便会使唤他的三个徒弟去做。但是三个徒弟尽职尽责,为了保护师傅,必须留在唐僧身边。此时,多亏了三个徒弟能够千变万化,且都可通过毛发来变作自身(八戒、沙僧不知是否具有此功能?暂时看做有吧)。当唐僧需要洗衣、化斋、喝水、探路、借宿、吃水果等时,便会吩咐一个徒弟去做,此时该徒弟便通过具有的“克隆”功能产生一个新的自己去做这些事情,自己仍旧守护在唐僧身边。

    3、原型模式类图:

       

    角色

    • Prototype:声明了克隆自身的接口。
    • ConcretePrototype:具体的物品,同样具有克隆自身的功能。如场景描述中的八戒、悟空、沙僧等。
    • Client:用户类,使用Prototype作为属性或方法的传入参数,利用Prototype类型实例的Clone方法来获取新的Prototype实例。Client与Prototype类之间可能是关联或依赖关系。如场景描述中的多事、使唤指使人的唐僧。

    协作

    • 客户请求一个原型,利用原型实例克隆自身的功能来获取新的实例。

    4、实例类图:

      

      说明:当唐僧同学有事要做,比如洗衣(XiYi)时,便会派一个徒弟去河边洗衣服。

      实例类图中的类基本对应原型模式的类图。

    5、实例代码:

      TangSeng类的代码,对应用户类,相当于一个自产自销的工厂。

     1 public class TangSeng{
     2     private SuperCreature wuKong;
     3     private SuperCreature baJie;
     4     private SuperCreature shaSeng;
     5 
     6     public void xiYi(){
     7         SuperCreature baJieCloned = baJie.clone();
     8 
     9         //baJieCloned去洗衣服了。。。baJie仍在师傅身边
    10     }
    11 
    12     public void jieSu(){
    13         SuperCreature shaSengCloned = shaSeng.clone();
    14 
    15         //shaSengCloned去借宿了。。。沙僧仍在师傅身边
    16     }
    17 
    18     public void chiShuiGuo(){
    19         SuperCreature wuKongCloned = wuKong.clone();
    20 
    21         //wuKongCloned去找水果了。。。wuKong仍在师傅身边
    22     }
    23 
    24     public void huaZhai(){
    25         SuperCreature shaSengCloned = shaSeng.clone();
    26 
    27         //shaSengCloned去化斋了。。。沙僧仍在师傅身边
    28     }
    29 
    30 
    31     /*其他事情。。。。*/
    32 }

      其他类的代码相对简单些,此处不列出,主要是提供自身克隆功能。

    6、原型模式特点:

    • 相比抽象工厂模式和工厂方法模式,极大的减少了子类的构造。
    • 每个产品(或物品)类都需要提供克隆自身的功能,用于产生一个同样的对象。
  • 相关阅读:
    iperf/iperf3网络测试工具的安装与使用
    驱动模块(4)——模块编译
    760. Find Anagram Mappings
    MySQL面试题
    MySQL 的数据存储引擎
    203. Remove Linked List Elements
    数据库事务隔离级别
    232. Implement Queue using Stacks
    MySQL中的事务
    482. License Key Formatting
  • 原文地址:https://www.cnblogs.com/-crazysnail/p/3925557.html
Copyright © 2011-2022 走看看