原型设计模式(prototype

时间:2022-12-09 18:52:06

# 什么是原型设计模式

> 这里与软件工程中的原型开发模式有那么一点类似的地方,我们首先需要构建出一个原型,这个原型可以在现实开发中抽象出来的具体类型,但是这个类型与具体的类又不同,需要抽取公共的部分,通过构建管理器,实现创建不同需要的类型,

### 考虑使用原型设计模式的三种情况

第一种情况是需要处理的对象太多,如果将它们分别作为一个类,必须要编写很多个类文件难以根据类生成实例时

第二种情况是生成实例的过程太过复杂,很难根据类来生成实例。例如,我们假设这里有一个实例,即表示用户在图形编辑器中使用鼠标制作出的图形的实例。想在程序中创建这样的实例是常困难的,通常,在想生成一个和之前用户通过操作所创建出的实例完全一样的实例的时候,我们会事先将用户通过操作所创建出的实例保存起来,然后在需要时通过复制来生成新的实例想解藕框架与生成的实例时

第三种情况是想要让生成实例的框架不依赖于具体的类。这时,不能指定类名来生成实例,而要事先“注册”一个“原型”实例,然后通过复制该实例来生成新的实例。

### 类接口表关系表

类名

描述

framework

manager

调用createclone

framework

product

声明use createclone

naN

rectangle

具体打印矩形

nan

triangle

具体打印三角形

Prototype 是由product担任的

ConcreteProtopyte 实现赋值新实例的方法 由具体的你需要的角色来担任

Client 通过调用createclone 创建新的实例,由Manger类扮演这个角色

### uml

原型设计模式(prototype

use 在接口中是交给子类去实现的

createclone 创建具体的对象

- code  framework

 package base.prototype.framework;

 /**

  * @program: DesignPatterns

  * @description: 声明use, createclone具体复用

  * @author: Mr.Dai

  * @create: 2018-05-28 21:28

  **/

 public interface Product extends Cloneable {

      public abstract void use(int len);

      public abstract Product createClone();

 }
 import java.util.HashMap;

 /**

  * @program: DesignPatterns

  * @description: 产生具体的类,维护多重对象

  * @author: Mr.Dai

  * @create: 2018-05-28 21:31

  **/

 public class Manager {

     private HashMap<String,Product> warehouse=new HashMap<>();

     public void registers(String name,Product product){

         warehouse.put(name,product);

     }

     public Product createObj(String name){

         Product product = warehouse.get(name);

         return product.createClone();

     }

 }

- code domain 具体的实现的类

 /**

  * @program: DesignPatterns

  * @description: 打印矩形

  * @author: Mr.Dai

  * @create: 2018-05-28 21:38

  **/

 public class Rectangle implements Product {

     private char mark = '*';

     public Rectangle(char mark) {

         this.mark = mark;

     }

     public Rectangle() {

     }

     @Override

     public void use(int len) {

         for (int i = 0; i < len; i++) {

             if(i==0||i==len-1){

                 for (int k = 0; k < len; k++) System.out.print(mark);

             }else{

                 System.out.print('*');

                 for (int j = 0; j < len-2; j++) {

                     System.out.print(' ');

                 }

                 System.out.print('*');

             }

             System.out.println();

         }

     }

     @Override

     public Product createClone() {

         Product product = null;

         try {

             product = (Product) clone();

         } catch (CloneNotSupportedException e) {

             e.printStackTrace();

         }

         return product;

     }

 }

 import base.prototype.framework.Product;

 /**

  * @program: DesignPatterns

  * @description: 打印三角形

  * @author: Mr.Dai

  * @create: 2018-05-28 21:47

  **/

 public class Triangle implements Product {

     @Override

     public void use(int len) {

         for (int i = 0; i < len; i++) {

             for (int j = i; j < len; j++) {

                 System.out.print(' ');

             }

             for (int j = 0; j < 2*i + 1; j++) {

                 System.out.print('*');

             }

             System.out.println();

         }

     }

     @Override

     public Product createClone() {

         Product product=null;

         try {

             product=(Product)clone();

         }catch (CloneNotSupportedException e){

             e.printStackTrace();

         }

         return product;

     }

 }

-  结果

原型设计模式(prototype

### 需要说明的是

> 面向对象的根本思想是作为组件复用:一旦出现的类名字就无法与该类区分开来,也就无法实现复用,如果不替换源代码 以java来说,重要的是当只有class文件的时候还能不能被复用,即使没有java文件也能够复用才是关键,

>要注意在顶层product 接口声明 集成的java.lang.cloneable。的接口是称之为标记接口 只要这样下面雇用的具体的类才能调用具体的clone方法才不会抛出异常,,说明了 实现了cloneable 接口的实例是可以进行调用clone方法进行复制的,返回是一个新的实例,(clone内部所进行的处理是分配与要复制的实例同样大小的内存空间,是一盒字段复制 也很称 浅拷贝);也就是说 如在类中存在 数组 那么拷贝 只会拷贝数组的引用,不会对数组进行正的复制。如果你需要一个新的引用那么你需要 重写clone ,但是不要忘记 调用super。clone

### 相关设计模式

  • Flyweight

prototype可以生成一个与当前实例相同的的实例,使用Flyweight 模式可以在不同的地方使用同一个实例。

  • Memento

提供保存当前实例状态,实现撤销与快照功能

  • Composite 与 Decorator模式

如果需要动态创建复杂的结构的实例,可以用prototype作为clone

  • Command

复制Command模式中出现的额命令时,可以使用Prototype

原型设计模式(prototype的更多相关文章

  1. 原型设计模式 Prototype

    参考1 http://www.cnblogs.com/libingql/p/3633377.html http://www.cnblogs.com/promise-7/archive/2012/06/ ...

  2. 小菜学习设计模式(四)—原型(Prototype)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  3. Net设计模式实例之原型模式&lpar; Prototype Pattern&rpar;

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  4. &lbrack;设计模式&rsqb; 4 原型模式 prototype

    设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  5. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

  6. 乐在其中设计模式&lpar;C&num;&rpar; - 原型模式&lpar;Prototype Pattern&rpar;

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  7. 设计模式的征途—5&period;原型(Prototype)模式

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

  8. PHP设计模式 原型模式&lpar;Prototype&rpar;

    定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...

  9. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

随机推荐

  1. Akka框架使用注意点

    1.mailbox Akka的每个actor默认有一个mailbox,按照FIFO顺序单线程处理.在抛出异常导致父actor根据设置的监管策略执行重启或恢复操作时,会从触发异常的消息的后续消息开始处理 ...

  2. python学习笔记&lpar;2&rpar;

    1.for循环 用户按照顺序循环可迭代对象中的内容. li = [11,22,33,44] for i in li: print i for循环的else 此功能目前只有for循环里面有发现. 具体条 ...

  3. Enterprise Architect的共享Respository设置,postgresql数据库

    Enterprise Architect有一个很实用的共享,在设计UML图的时候,可以连接到一个数据库服务器,将所有的画图数据共享在上面,所有连到这个server的人,都可以看到 别人的图,图中的元素 ...

  4. thinkphp隐藏中url的index&period;php

    在本地进行测试 1.修改apache配置文件将如下代码#去掉 #LoadModule rewrite_module modules/mod_rewrite.so   在index.php 目录下新建文 ...

  5. win7 设置自动关机

    1.C:\Windows\System32\shutdown.exe 2. -s:表示关机: -r:表示重启: -t:表示时间,以秒为单位: -a:表示取消shutdown计划,即表示取消关机或重启命 ...

  6. oracle 存储过程和函数例子 --2

    关于 游标 if,for 的例子 create or replace procedure peace_if is cursor var_c is select * from grade; begin ...

  7. oracle insert &amp&semi;字符插入问题

    例如执行一下语句: insert into NSRXT_SP (SP_ID, SP_TITLE, SP_DESC, SP_URL, SP_TYPE, SP_SUB_TYPE, ADD_TIME, CZ ...

  8. MVC4 路由参数带点 文件名后缀导致错误

    错误描述 最近在研究office在线预览,用到mvc4  apicontroller 需要传参是文件名,如test.docx导致错误"指定的目录或文件在 Web 服务器上不存在", ...

  9. 之一 select模型

    // select.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <WinSock2.h> #include ...

  10. &lbrack;20180813&rsqb;刷新共享池与父子游标&period;txt

    [20180813]刷新共享池与父子游标.txt --//测试刷新共享池与父子游标含有那些信息保存在共享池.--//自己最近遇到的问题,感觉自己以前理解有点乱,测试看看. 1.环境SCOTT@book ...