摘要:本文用一个实例场景描述Gof 23设计模式中的原始模型模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 原始模型模式 Quarkus

1 基础知识
1.1 标准定义
原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1.2 分析和说明
原型模式是指用原型实例指定创建对象的种类,并且通过拷贝(克隆)这些原型创建新的对象。原型模式也是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类是在运行时刻指定时,可使用原型模式。原始模型模式适用于任何的等级结构。原型模式的结构如图1。原型模式的缺点是每一个类都必须配备一个克隆方法。
Prototype的角色包括客户(Client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。Prototype用来声明一个拷贝自身的接口,ConcretePrototype用来实现一个拷贝自身的操作;Client用来让一个原型拷贝自身从而创建一个新的对象。
图1 原始模型模式的标准结构图
 客户(Client)角色:客户类提出创建对象的请求。
 抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。
 具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

2 应用场景举例
比如公司对于各个产品都有自己的宣传资料。每个宣传资料的组成都是首先对公司进行介绍。其次是对公司组织结构介绍,中间内容才是对产品的技术介绍,案例说明,最后还要留下公司的通信联系方式。所以,对于不同产品的宣传资料中关于公司介绍、组织机构和公司的通信地址都是一样的。这样就可以采用Prototype。从基本的公司产品资料中克隆出来一个介绍模板,然后根据具体产品再说明各个产品的技术参数。用例见图2所示。

图2 原始模型模式的用例图
在这里可以把AbstractPrototype理解为抽象原型(Prototype)角色。CompanyBaseIntroduction是具体原型(Concrete Prototype)角色。其实现类图如下:
图3 原始模型模式的类图

原始模型实现的顺序图如图4所示,实现顺序描述:① 创建一个company实例对象;② 再新建一个departA实例对象,从company实例对象克隆过来;③ 获得departA实例对象;④ 调用departA的addSomeIntrouction方法;⑤ 显示departA的内容。
图4 原始模型模式实现顺序图

3.Quarkus的实现程序代码
Quarkus程序实现主要包括AbstractPrototype抽象类文件,CompanyBaseIntroduction类文件2个文件。其关系如图3所示。下面分别列出这2个文件的程序代码,最后列出测试代码并显示输出结果。
AbstractPrototype抽象类程序代码清单01所示。
程序代码清单01

@ApplicationScoped
public abstract class AbstractPrototype {   public AbstractPrototype cloneMyself() {return this;}public void addSomeIntrouction(String topic, String content) {}public void deleteSomeIntrouction(String key) {}public void showIntrouction() { }
}

CompanyBaseIntroduction类文件程序代码清单02所示。
程序代码清单02

@ApplicationScoped
public class CompanyBaseIntroduction extends AbstractPrototype{
private Map<String, String> introductionMap = new HashMap<String, String>();public CompanyBaseIntroduction(){      }public CompanyBaseIntroduction(Map<String, String> map){introductionMap = map;}public AbstractPrototype cloneMyself(){addSomeIntrouction("公司介绍", "这是公司基本介绍");   AbstractPrototype object = new CompanyBaseIntroduction(introductionMap);       return object;} public void addSomeIntrouction(String topic, String content) {introductionMap.put(topic, content);      }public void deleteSomeIntrouction(String key) {if (introductionMap.containsKey(key))introductionMap.remove(key);}public void addIntrouctionMap(Map<String, String> map){introductionMap.putAll(map);}public Map<String, String> getIntroductionMap(){return introductionMap;}public void showIntrouction() {Iterator<String> it = introductionMap.keySet().iterator();String key, value;while (it.hasNext()) {key = (String) it.next();value = (String) introductionMap.get(key);System.out.println("key: " + key + "; value: " + value);}}
}

原始模型测试程序的代码清单03如下:
程序代码清单03

public class PrototypeClient implements QuarkusApplication {@ConfigProperty(name = "gof23.creationalpattern.prototype.title", defaultValue = "gof23")String title;@Inject    CompanyBaseIntroduction company ;   @Inject    AbstractPrototype departA ; @Inject    AbstractPrototype company2 ;    @Overridepublic int run(String... args){System.out.println("———————" + title + "演示输出————————");  departA = company.cloneMyself();departA.addSomeIntrouction("部门A介绍", "这是部门A介绍的内容"); AbstractPrototype departB = departA.cloneMyself();departB.deleteSomeIntrouction("部门A介绍");departB.addSomeIntrouction("部门B介绍", "这是部门B介绍的内容");departB.showIntrouction();return 0;}public static void main(String... args) {     Quarkus.run(PrototypeClient.class, args);       }
}

原始模型测试类输出结果如下所示:

key: 部门A介绍; value: 这是部门A介绍的内容
key: 公司介绍; value: 这是公司基本介绍

4. 相关Quarkus程序源码下载
可以直接从github上获取代码,读者可以从github上clone预先准备好的示例代码。

git clone https://github.com/rengang66/quarkus-sample-gof23.git

这是一个Maven项目,然后Maven导入工程。该程序位于“src\main\java\com\iiit\quarkus\sample\gof23\creationalpattern\prototype”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:

git clone https://gitee.com/rengang66/quarkus-sample-gof23.git

5 扩展和说明
在java中已经在语言层次上支持了原始模型模式。在java语言所有的类的顶级父类都是java.lang.Object类。java.lang.Object类有一个clone()方法,该方法就是实现创建并返回此对象的一个副本。

参考文献

[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[3] 阎宏,Java与模式,北京:电子工业出版社. 2002.10
[4] 王俊峰 戚晓滨. 设计模式和UML. 计算机应用研究,1999.16(5), 27-29,39.
[5] 陈琴 朱正强. UML在设计模式描述中的应用. 计算机工程与设计,2003.24(4), 81-84.
[6] 唐慕瑾 徐伯庆 孙国强. Java类的动态装载机制及其在设计模式中的应用. 上海理工大学学报,2004.26(1), 80-84.
[7] 唐伟 曲俊华. 基于JAVA的原型对象池的设计. 中国电力教育,2005.(z2), 207-211.
[8] 万波 张焰 罗治强. 设计模式在Drawcli程序中的应用. 计算机应用与软件,2003.20(8), 12-13,84.
[9] 贺志国 曾俊 陈天泽 匡纲要. 设计模式在标图系统中的综合应用. 计算机应用研究,2005.22(9), 176-179.
[10] 侯晓辉 陈堃銶 贾娟 杨清清. 基于设计模式的数据库出版系统的框架模型. 小型微型计算机系统,2004.25(11), 2044-2048.
[11] Quarkus官网. https://quarkus.io/

04-原始模型模式Quarkus实现相关推荐

  1. 15-责任链模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的责任链模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 责任链模式 Quarkus 1 基 ...

  2. 03-建造模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的建造模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 建造模式 Quarkus 1 基础知 ...

  3. 16-命令模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的命令(Command)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 命令模式 Quar ...

  4. 08-合成模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的合成模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 合成模式 Quarkus 1 基础知 ...

  5. 12-代理模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的代理模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 代理模式 Quarkus 1 基础知 ...

  6. 18-调停者模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的调停者模式,并用Quarkus程序代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 调停者模式 Quarkus 1 基 ...

  7. 02-抽象工厂模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的抽象工厂模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 抽象工厂模式 Quarkus 1 ...

  8. 07-桥梁模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的桥梁模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 桥梁模式 Quarkus 1 基础知 ...

  9. 01-工厂模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的工厂(Factory Method)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 工厂 ...

最新文章

  1. Cannot input a tensor of dimension other than 0 as a scalar argument
  2. android listview 不显示_ListView详细介绍与使用
  3. antd + react model自定义footer_更骚的create-react-app开发环境配置craco
  4. nginx 响应服务器静态,405 Not Allowed,nginx静态文件响应post请求
  5. 计算机网络课程设计之TELNET 终端设计与实现
  6. Spring框架学习笔记10:基于XML配置方式SSM框架西蒙购物网
  7. Spark源码分析之Task
  8. ​苹果WWDC20确定6月22日线上举办;任天堂遭史上最大规模黑客攻击 ;Inkscape 1.0 发布 | 极客头条...
  9. java日期加一天_Java 关于日期加一天(日期往后多一天)
  10. vs 2015 加载该页时出错。 解决方案
  11. BOW和LSH的一点理解
  12. Java静态变量小感
  13. 中兴zxr10路由器重启命令_zxr10维护常用命令
  14. BLP读书笔记(一)——通过shell访问终端模式
  15. BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)
  16. 中外大都市人口密度的数据比较
  17. php泛目录站群系统,php泛目录站群
  18. Lenovo笔记本各类型触控板,触摸部分只能移动无法点击的问题汇总
  19. UBLOX板卡基础设置--F9P板卡配置(基准站和流动站)
  20. ubuntu无法上网

热门文章

  1. MySQL如何退出命令行
  2. 先进先出物料架_仓库物料的先进先出FIFO管理(如何做到先进先出)
  3. 中国流量排名前一百名网站
  4. python独热编码作用_关于sklearn独热编码
  5. Windows安装Navicat(最新版)
  6. win10打开网路邻居计算机,win10系统下网上邻居不能访问其他电脑的解决方法
  7. 我的时间管理之一 ——做好规划
  8. 实现字符串左旋和右旋的常见方法
  9. 震动环境如何使用称重传感器
  10. bps pps fps的定义