一天一个设计模式——Prototype 原型模式

Posted zheng-hong-bo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天一个设计模式——Prototype 原型模式相关的知识,希望对你有一定的参考价值。

一、模式说明

   看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数。

二、原型模式的类图

技术图片

三、原型模式中的角色

  • 原型(Protype)角色:负责定义复制现有实例生成新实例的方法
  • 具体原型(ConcretePrototype)角色:负责实现复制现有实例生成新实例的方法
  • 使用者(Client)角色:负责使用复制实例的方法生成新实例

四、代码示例

1.Product类:

技术图片
package com.designpattern.cn.protptypepattern.patternframework;

public interface Product extends Cloneable 
    public abstract void use(String s);
    public abstract Product createClone();
View Code

  上面的Product类很简单,只是继承了java.lang.Clonable接口,该接口中并没有要求实现任何方法,这是一个标记接口,被该接口标记的类可以调用Clone方法来克隆类实例。需要注意的是,Clone方法并不是定义在Clonable接口中,而是定义在java.lang.Object中,另外需要提一点,Clone方法实现的是浅复制。

2.Manager类:

技术图片
package com.designpattern.cn.protptypepattern.patternframework;

import java.util.HashMap;

public class Manager 
    private HashMap showcase = new HashMap();
    public void register(String name, Product product)
        showcase.put(name, product);
    
    public Product create(String protoname)
        Product p = (Product) showcase.get(protoname);
        return p.createClone();
    
View Code

  上面的Manager类提供了register方法,将字符串和Product接口注册保存到showcase中,现在还无法知道Product具体类是什么,但是可以确定这个具体类是实现了Product接口的,因此这个类可以调用use方法和createClone方法创建实例的克隆。

  接下来创建几种不同的Product具体的子类,每个子类都实现了Product接口:

3-1.MessageBox消息盒子类:

技术图片
package com.designpattern.cn.protptypepattern.patterndemostrate;

import com.designpattern.cn.protptypepattern.patternframework.Product;

public class MessageBox implements Product 
    private char decochar;
    public MessageBox(char decochar)
        this.decochar = decochar;
    

    public void use(String s)
        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("");
    

    public Product createClone()
        Product p = null;
        try 
            p = (Product) clone();
        catch (CloneNotSupportedException e)
            e.printStackTrace();
        
        return p;
    
View Code

3-2UnderlinePen类:

技术图片
package com.designpattern.cn.protptypepattern.patterndemostrate;

import com.designpattern.cn.protptypepattern.patternframework.Product;

public class UnderlinePen implements Product 
    private char ulchar;
    public UnderlinePen(char ulchar)
        this.ulchar = ulchar;
    

    public void use(String s)
        int length = s.getBytes().length;
        System.out.println("\\"" + s + "\\"");
        System.out.println(" ");
        for(int i = 0; i < length + 4; i++)
            System.out.print(ulchar);
        
        System.out.println("");
    

    public Product createClone()
        Product p = null;
        try 
            p = (Product) clone();
        catch (CloneNotSupportedException e)
            e.printStackTrace();
        
        return p;
    
View Code

4.测试类和运行结果:

技术图片

原型模式在javascript中也有应用,后续再补充这方面的内容,可以对比看下Java和Javascript中实现原型模式的不同。

---------------------2019-06-27 00:13 比较晚了,今天加班到10点回家,原型模式还是比较重要的,这篇随笔后续继续补充-----------------------------

以上是关于一天一个设计模式——Prototype 原型模式的主要内容,如果未能解决你的问题,请参考以下文章

浅析设计模式——创建型模式之Prototype(原型模式)

一天学习一个设计模式之原型模式

设计模式学习总结原型模式(Prototype)

设计模式——原型模式

java设计模式-原型(prototype)

创建者模式之原型模式