prototype(原型)模式

prototype(原型)模式

图解设计模式读书笔记
  1. 问题引出

    有时候我们需要“在不指定类名的前提下生成示例”,此时,我们就不能根据类来生成实例,而要根据现有实例来生成实例。

    1. 难以根据类来生成实例

      若实例的生成过程太过复杂,比如用户在图形编辑器中使用鼠标制作出的图形实例,要想做出一模一样的十分困难,此时,我们就必须利用当前实例来生成一个相同的实例。

    2. 解耦框架与生成的实例

      想让生成的实例不依赖于具体的类,此时,不指定类名来生成示例,而是事先生成一个“原型”实例,再通过复制该实例来生成新实例。

  2. UML图

在这里插入图片描述

  1. 根据原型(Prototype)来规定需要的接口,通过具体原型(ConcretePrototype)继承原型接口来实现方法,使用者(Client)负责使用复制实例方法生成新的实例。

  2. 示例:

    // Product.java
    public interface Product extends Cloneable{
        void use(String s);
        Product createClone();
    }
    // Manager.java
    public class Manager {
        private Map<String, Product> showcase = new HashMap<>();
    
        public void register(String name, Product product) {
            showcase.put(name, product);
        }
    
        public Product create(String protoName) {
            Product p = showcase.get(protoName);
            return p.createClone();
        }
    
        @Override
        public String toString() {
            return "Manager{" +
                    "showcase=" + showcase +
                    '}';
        }
    }
    // MessageBox.java
    public class MessageBox implements Product {
        private char decochar;
    
        public MessageBox(char decochar) {
            this.decochar = decochar;
        }
        public void use(String s) {
            int length = s.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("");
        }
    
        @Override
        public Product createClone() {
            Product product = null;
            try {
                product = (Product) clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            return product;
        }
    
        @Override
        public String toString() {
            return "MessageBox{" +
                    "decochar=" + decochar +
                    '}';
        }
    }
    // UnderlinePen.java
    public class UnderlinePen implements Product {
        private char ulchar;
    
        public UnderlinePen(char ulchar) {
            this.ulchar = ulchar;
        }
    
        public void use(String s) {
            int length = s.length();
            System.out.println("\""  + s + "\"");
            System.out.print(" ");
            for (int i = 0; i < length; 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;
        }
    
        @Override
        public String toString() {
            return "UnderlinePen{" +
                    "ulchar=" + ulchar +
                    '}';
        }
    }
    
  3. 如果需要优化UnderlinePenMessageBox,将二者的createClone提取到一个父类中。

    public class StringOperate implements Product {
        @Override
        public void use(String s) {
    
        }
    
        @Override
        public Product createClone() {
            Product product = null;
    
            try {
                product = (Product) clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            return product;
        }
    }
    

    让两个类继承此类即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值