设计模式

原型模式(Prototype)

2020-07-18  本文已影响0人  秀儿2020

定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

本质

克隆生成对象

克隆是手段,目的是生成对象实例。

登场角色

示例代码

/**
 * 定义复制功能的接口
 */
public interface Product extends Cloneable{
    void use(String s);
    Product createClone();
}


/**
 * 具体的原型1
 */
public class MessageBox implements Product{
    private char decochar;
    public MessageBox(char s){
        this.decochar = s;
    }

    @Override
    public void use(String s) {
        System.out.println("use. " + s);
    }

    @Override
    public Product createClone() {
        Product product = null;
        try {
            product = (Product)clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return product;
    }
}


/**
 * 具体的原型2
 */
public class UnderlinePen implements Product{
    private char ulchar;
    public UnderlinePen(char c){
        this.ulchar = c;
    }
    @Override
    public void use(String s) {
        System.out.println("use. " + s);
    }

    @Override
    public Product createClone() {
        Product product = null;
        try {
            product = (Product)clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return product;
    }
}


/**
 * Client 管理现有类,并可用现有类对象创建出新的对象
 */
public class Manager {
    private HashMap<String,Product> showCase = new HashMap<>();
    public void register(String name,Product product){
        showCase.put(name,product);
    }
    public Product createProduct(String prototypeName){
        return showCase.get(prototypeName).createClone();
    }
}

/**
 * 测试
 */
public class Main {
    public static void main(String args[]){
        Manager manager = new Manager();
        MessageBox messageBox = new MessageBox('m');
        UnderlinePen underlinePen = new UnderlinePen('u');
        manager.register("m",messageBox);
        manager.register("u",underlinePen);

        Product messageBoxClone = manager.createProduct("m");
        Product underlinePenClone = manager.createProduct("u");
        messageBoxClone.use("this is the messageBoxClone");
        underlinePenClone.use("this is the underlineClone");
    }
}

运行结果

use this is the messageBoxClone
use this is the underlineClone

功能

优点

缺点

何时使用

上一篇 下一篇

猜你喜欢

热点阅读