设计模式之Prototype模式

 作用:当我们需要在不指定类名的情况下生成实例时,可以使用Prototype模式来通过复制生成实例

 

UML类图:

 

Product接口:

 

public interface Product extends Cloneable
{
    public abstract void use(String s);
    public abstract Product createClone();
}

 

Manager类:生成对应的克隆对象

public class Manager
{
    private HashMap showcase = new HashMap();//构建哈希表 
    //构建哈希映射,将每种信号与类对象进行挂钩 
    public void register(String name,Product proto) 
    {
        showcase.put(name,proto);
    }
    //通过信号字符串去创建对应对应的类对象(克隆得方法去创建新对象) 
    public Product create(String protoname)
    {
        Product p = (Product)showcase.get(protoname);
        
        return p.createClone();
    }
}

 

MessageBox类:克隆对象生成的主体实现

public class MessageBox implements Product
{
    private char decochar;
    public MessageBox(char decochar)
    {
        this.decochar = decochar;
    }
    
    public void use(String s)
    {
        System.out.println("MessageBox Use");
    }
    //克隆对象并返回 
    public Product createClone()
    {
        Product p = (Product)clone();
        
        return p;
    }
}

 

UnderlinePen类:克隆对象生成的主体实现

public class UnderlinePen implements Product
{
    private char ulchar;
    public UnderlinePen(char ulchar)
    {
        this.ulchar = ulchar;
    }
    public void use(String s)
    {
        System.out.println("UnderlinePen Use");
    }
    //克隆对象并返回 
    public Product createClone()
    {
        Product p = (Product)clone();
        
        return p;
    }
}

 

main函数:

public static void Main(String[] argvs)
{
    Manager manager = new Manager();
    
    UnderlinePen upen = new UnderlinePen('~');
    MessageBox mbox = new MessageBox('*');
    manager.register("strong",upen);
    manager.register("warning",mbox);
    
    Product p1 = manager.create("strong");
    p1.use("Hello");
    
    Product p1 = manager.create("warning");
    p1.use("Hello");
}

 

模式细谈:Product接口继承Clone,使其可以仅通过类的对象进行创建新的对象(拷贝构造),且使继承Product的接口均可以通过这种方式来生成复制实例,Manager类作用是调用继承了Product的类可以通过Manager类的对象进行生成对象。

任何对象均可以通过继承Prouduct接口,然后再通过Manager来复制创建实例,Product存在仅仅是为了多态,Product对象可以指向任何继承其接口的类

posted on 2019-05-03 21:13  么么打123  阅读(189)  评论(0编辑  收藏  举报