说说优秀设计模式--原型

说说优秀设计模式--原型说说优秀设计模式--原型(Prototype)

2016-1-8 by Damon


说说原型(Prototype)
一句话总结

不再是利用类产生对象实例,而是复制对象实例产生新的对象实例。
比喻:买蛋糕时,指着一个蛋糕说要一样的,然后得到新做的一样的蛋糕。

有什么好处
  1. 用于不容易用类产生对象实例的场景;
  2. 框架和所产生的对象实例解耦;
简单的小例子

Product 接口继承Cloneable,声明可以执行克隆(clone)

public interface Product extends Cloneable {

    public abstract void use(String s);

    public abstract Product createClone();

}

Manager类利用Product接口进行复制

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 name) {
        Product p = showcase.get(name);
        return p.createClone();
    }
}

Product 接口实现类 MessageBox

public class MessageBox implements Product {

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

    /* (non-Javadoc)
     * <p>use</p>
     * <p></p>
     * @param s
     * @see pattern.creational.prototype.framework.Product#use(java.lang.String)
     */
    @Override
    public void use(String s) {
        // TODO Auto-generated method stub
        int length = s.getBytes().length;
        for(int i = 0; i < length + 4; i++){
            System.out.print(decochar);
        }
        System.out.println("");
        System.out.println(decochar + " " + s + " " + decochar);
        for(int i = 0; i < length + 4; i++){
            System.out.print(decochar);
        }
        System.out.println("");
    }

    /* (non-Javadoc)
     * <p>createClone</p>
     * <p></p>
     * @return
     * @see pattern.creational.prototype.framework.Product#createClone()
     */
    @Override
    public Product createClone() {
        // TODO Auto-generated method stub
        Product p = null;
        try {
            p = (Product) clone();
        } catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return p;
    }

    }

Product 接口实现类 UnderlinePen

public class UnderlinePen implements Product {

    private char ulchar;
    public UnderlinePen(char ulchar){
        this.ulchar = ulchar;
    }

    /* (non-Javadoc)
     * <p>use</p>
     * <p></p>
     * @param s
     * @see pattern.creational.prototype.framework.Product#use(java.lang.String)
     */
    @Override
    public void use(String s) {
        // TODO Auto-generated method stub
        int length = s.getBytes().length;
        System.out.println("\"" + s + "\"");
        System.out.print(" ");
        for(int i = 0; i < length; i++){
            System.out.print(ulchar);
        }
        System.out.println("");
    }

    /* (non-Javadoc)
     * <p>createClone</p>
     * <p></p>
     * @return
     * @see pattern.creational.prototype.framework.Product#createClone()
     */
    @Override
    public Product createClone() {
        // TODO Auto-generated method stub
        Product p = null;
        try {
            p = (Product) clone();
        } catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return p;
    }

}

Main 测试类

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Manager manager = new Manager();
    UnderlinePen upen = new UnderlinePen(‘~‘);
    MessageBox mbox = new MessageBox(‘*‘);
    MessageBox sbox = new MessageBox(‘/‘);
    manager.register("Strong message", upen);
    manager.register("warning box", mbox);
    manager.register("slash box", sbox);

    Product p1 = manager.create("Strong message");
    p1.use("Hello, world.");
    Product p2 = manager.create("warning box");
    p2.use("Hello, world.");
    Product p3 = manager.create("slash box");
    p3.use("Hello, world.");
}
优秀案例分析
时间: 2024-11-04 15:37:57

说说优秀设计模式--原型的相关文章

说说优秀设计模式--模板方法

说说优秀设计模式--模板方法说说优秀设计模式--模板方法(Template Method) 2016-1-1 by Damon 说说模板方法(Template Method) 一句话总结 父类方法调用抽象方法,方法抽象定义在父类,实际实现处理交给子类,按照流程完成整件事就是"模板方法模式". 有什么好处 遵照父类定义的前提下,不同的子类可以给父类抽象的模板方法提供不同的实现,提供拓展能力. 简单的小例子 父类:AbstractDisplay     public abstract cl

谈谈设计模式~原型模式(Prototype)

返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. 从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷

10. 星际争霸之php设计模式--原型模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248189.html============================================

炒冷饭系列:设计模式 原型模式

炒冷饭系列:设计模式 原型模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难:亲恶我,孝方贤. 一.什么是原型模式 Prototype模式是一种对象创建型模式,它採取复制原型对象的方法来创建对象的实例.使用 Prototype模式创建的实例,具有与原型一样的 数据. 二.原型模式的特点 1. 由原型对象自身创建目标对象.也就是说,对 象创建这一动作发自原型对象本身. 2.目标对象是原型对象的一个克隆

java设计模式 - 原型(干货)

深度讲解23种设计模式,力争每种设计模式都刨析到底.废话不多说,开始第二种设计模式 - 原型. 一.为什么有原型模式 当一个类需要克隆的时候,我们总不希望new一个对象,然后逐个属性去设置值. 这个时候,我们亟需一种 高效的对象copy方法,原型设计模式应运而生. 二.原型设计模式写法 原型设计模式实现: public class Person implements Cloneable { private String userName; private String sex; private

java设计模式---原型模式

原型模式也是创建型的设计模式,通过拷贝原型创建新的对象,理解原型模式必须理解java中的浅复制和深复制.复制也称为克隆.会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型.其余的都是浅拷贝. 浅克隆:浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象. 深克隆:深克隆不仅克隆所考虑的对象,也克隆它所引用的对象. 它的核心是就是原型类Prototype.Prototype类需要具备以下两个条件: 实现Cloneable接口.在java语言有一个Cloneable接

java语言实现创建型设计模式—原型模式(Prototype)

一.描述 原型模式是通过一个原型对象来标明要创建的对象的类型,然后用复制这个原型对象的方法来拷贝创建更多的同类型对象.例如我们在程序的动态运行过程中有了一个对象,这个对象中包含了一系列的有效数据,我们此时需要一个和该对象完全相同的新对象,并且在拷贝之后,新旧对象之间没有任何联系,对任何一个对象的更改都不影响另一个对象. 在java中所有类都默认继承自java.lang.Object类,在这个Object类中有一个clone()方法,该方法将返回Object对象的一个拷贝. 我们让需要被拷贝的类实

[工作中的设计模式]原型模式prototype

一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.prototype.run=function(){ alert(this.name+" is running"; } 此处的原型是js的特殊定义,在原型上定义的属性和方法所有的类进行共享. 不过设计模式中的原型模式指的是:将已有的对象作为原型,拷贝出一份具有相同属性的新的对象. 模式定义为:原型

Objective-C设计模式——原型Prototype(对象创建)

1.原型 原型设计模式所谓原型设计模式,其实就是对象复制,这个特性在所有语言基本上都是存在的. 我们知道在OC中,对象赋值其实是对对象的引用复制,其实就是相当于C语言中的指针.创建了一个新的变量,但是还是指向的同一块内存地址. 所以一旦一个引用改变了该对象的属性,那么其他指向该对象的引用全部都会发生变化. 有时候我们并不像要这样做,我们希望重新创建一个和赋值对象一模一样的一个对象.比如我们写游戏的时候创建了一个enemy对象并对其复杂的行走路径进行了自定义,此时我们想要在创建一个.但是再次创建时