Prototype Pattern

名称由来

  不是利用类来产生实例对象,而是从一个对象实例产生出另一个新的对象实例 ,根据被视为原型的对象实例 ,建立起的另一个新的对象实例就称为原型模式(Ptototype Pattern)。

需求场景

  • 种类过多无法整合成类时
    第一种情形:若须处理的对象种类太多,如果要一个个设成不同的类,须产生大量的源程序文件
  • 不容易利用类产生对象实例时
    第二种情形:该对象的实例产生过程太复杂,很难利用类来建立。
  • 希望把框架和所产生的对象实例分开时
    第三种情形:希望让产生对象实例时的框架不会只存在于某些特殊类时。

功能演示

  测试程序类结构图如下:

  模式UML图中,共有三个类:

  • 接口,Product 己声明抽象方法use 和 createClone的接口
  • 管理类,Manager 利用createClone 复制对象实例的类
  • 普通类,MessageBox 把字符串框起来use 的类,实现Product的createClone 和use 方法。

  Product 接口

public interface Product extends Cloneable{

public abstract String use(String s);
    
    public abstract Product createClone();
}

  有了Product 接口 ,才可能进行复制。这个接口继承java.lang.Cloneable 接口 ,利用clone 方法可自动对实现此接口 的类进行复制。

  use 方法是“使用”的部分,“使用”代表何种意义则需看子类的实现。

  createClone方法负责复制对象实例的部分。

  
Manager类

public class Manager {

private Hashtable<String, Product> showCase = new Hashtable<String, Product>();

public void register(String name, Product proto) {
        showCase.put(name, proto);
    }

public Product create(String protoName) {
        Product p = showCase.get(protoName);
        return p.createClone();
    }
}

  唯一跟其他类沟通的桥梁,负责添加和负责对象的实例。

  MessageBox类

public class MessageBox implements Product {

private char decochar;

public MessageBox(char dechar) {
        this.decochar = dechar;
    }

@Override
    public Product createClone() {
        // TODO Auto-generated method stub
        Product p = null;
        try {
            p = (Product) clone();
        } catch (CloneNotSupportedException e) {
            // TODO: handle exception
            e.printStackTrace();
        }

return p;
    }

@Override
    public String use(String s) {
        // TODO Auto-generated method stub
        int length = s.getBytes().length;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length + 4; i++) {
            sb.append(decochar);
        }
 
        sb.append(decochar + "\n\"" + s + "\"\n" + decochar);

for (int i = 0; i < length + 4; i++) {
            sb.append(decochar);
        }
        sb.append("");
        return sb.toString();

}

}

  createClone 方法是复制本身的方法,这里所调用的clone 方法规定在java 语言规格内,它会产生另一个分身(本身的复制品)。在产生复制品时,若该字段包含对象实例,则其值也会跟着复制到新的对象实例。能利用clone 方法进行复制的只限于实现java.lang.Cloneable 接口 的类。如无实现则会报异常。但MessageBox 本身实现了Product ,而Product 是己经继承了Cloneable接口。

  Java 语言的clone 方法只能从本身的类(含子类)调用,所以如果是其他类的要求而进行复制时,则须另以其他方法(如createClone)把clone 抓起来。

  android 界面入口测试该原型 Prototype 的PrototypeActivity

public class PrototypeActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

((Button) findViewById(R.id.Button01))
                .setOnClickListener(new OnClickListener() {

@Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub

Manager manager = new Manager();

MessageBox messageBox = new MessageBox('*');
                        manager.register("prototype", messageBox);

Product product = manager.create("prototype");
                        ((EditText) findViewById(R.id.EditText01))
                                .setText(product.use("android ap Pattern"));
                    }
                });
    }
}

运行效果如下:

源码下载:

原型模式

 再发个求职信息:

  求职android(可胜任Framework及 以上工作。一年半经验) 、Windows Phone 7(软件、XNA) 开发工作。

 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/612359,如需转载请自行联系原作者

Android Ap 开发 设计模式第六篇:原型模式相关推荐

  1. Android Ap 开发 设计模式第七篇:生成器模式

    Builder Pattern 模式解读 生活在深圳这所高速发展的城市,高楼大厦林立.所谓万丈高楼平地起,在我们感慨楼层的高耸之外,更要配服楼层的建造者和设计者.大楼首先得打稳地基.搭建骨架,再由下往 ...

  2. Android Ap 开发 设计模式第四篇:工厂方法模式

    Factory Method Pattern 模板模式的衍生品? 以Template Method Pattern 架构获取产生对象实例的工厂就是Factory Method Pattern. 工厂方 ...

  3. 设计模式(六)原型模式

    一.原型模式的作用? 1.基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式. 2.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这个其实和C ...

  4. Android UI开发第二十五篇——分享一篇自定义的 Action Bar

    Action Bar是android3.0以后才引入的,主要是替代3.0以前的menu和tittle bar.在3.0之前是不能使用Action Bar功能的.这里引入了自定义的Action Bar, ...

  5. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

    目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...

  6. Python开发【第六篇】:模块

    Python开发[第六篇]:模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一 ...

  7. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

  8. android Java开发设计模式及在android中的应用解析

    android Java开发设计模式及在android中的应用解析 什么是设计模式: 可以用一句话概括设计模式---设计模式是一种利用OOP的封闭.继承和多态三大特性,同时在遵循单一职责原则.开闭原则 ...

  9. Unity设计模式之-Unity3d游戏开发设计模式之子类沙盒模式

    ** 请关注微信公众号获取最新消息 ** 原文链接:http://blog.csdn.net/u013108312/article/details/52208635 本篇文章我们来看下Unity3d游 ...

最新文章

  1. OBJECT subcommand [arguments [arguments ...]]
  2. C# 删除文件错误 access denied
  3. Leetcode 345. 反转字符串中的元音字母 解题思路及C++实现
  4. 二十九、深入Python中的collections模块
  5. [CentOS Python系列] 六.阿里云搭建Django网站详解
  6. 今天会见广州用友的SALER
  7. k8s实战为aspnetcore.webapi微服务注入配置信息
  8. 小米平板5系列共三款机型:全系搭载2K/120Hz屏幕
  9. 2021-2025年中国云企业管理软件行业市场供需与战略研究报告
  10. idea 查看实现类快捷键及类里面的方法对应的快捷键、跳到下一行
  11. mysql+mmm+主动模式_Zabbix主动代理模式 + 主动模式agent客户端
  12. linux内核之数据机构
  13. VS MFC checkbox 控件默认选中
  14. Anylogic学习--------------数学函数
  15. 尚硅谷JavaWeb视频教程,新版升级
  16. CANoe隐藏属性——Multi CANoe
  17. 第十三章 外星人来了
  18. django创建子应用
  19. 图像融合质量评价方法SSIM、PSNR、EN、MSE与NRMSE(一)
  20. 在vue脚手架中,学习实现一个轮播图(2-旋转木马)

热门文章

  1. jQuery:表格的奇偶行变色,jquery实例之表格隔一行
  2. 浅析Asp.net MVC 中Ajax的使用
  3. linux 下运行 tomcat
  4. Linux基础-目录与路径
  5. 开发中的问题——环境相关
  6. #ifndef, #define, #endif的作用
  7. python encode gbk_[转]Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
  8. c#小游戏_C#小游戏—钢铁侠VS太空侵略者
  9. ccxprocess可以禁用么_提效 | 5G时代网站还需要加速么?
  10. HashSet和LinkedHashSet使用