zoukankan      html  css  js  c++  java
  • 原型模式

    1、概念

    原型模式一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。
    原型模式
    2、模式结构

    • 抽象原型(Prototype)角色:是一个抽象角色,此角色给出所有的具体原型类所需的接口
    • 具体原型(Concrete Prototype)角色:被复制的对象,此角色需要实现抽象的原型角色所要求的接口

    3、使用场景

    • 创建新对象成本较大,新对象可以通过复制已有对象来获得,如果相似对象,则可以对其成员变量稍作修改
    • 系统要保存对象的状态,而对象的状态很小
    • 避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的组合状态

    4、优缺点

    优点:

    • 将产品的创建过程封装起来,客户端不需要了解产品的具体创建流程
    • 提高效率,简化对象的创建过程
    • 可以使用深克隆的方式保存对象的状态

    缺点:

    • 每一个类必须都有一个clone方法
    • 如果类组成复杂,实现深度复制比较困难

    5、实例

    public abstract class Shape implements Cloneable {
    
        private String type;
    
        abstract void draw();
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Object clone = null;
            try {
                clone = super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return clone;
        }
    }
    
    public class Rectangle extends Shape {
    
        private String name = "Rectangle";
    
        public Rectangle() {
            setType(name);
        }
    
        @Override
        void draw() {
            // 画图逻辑
        }
    }
    
    public class Square extends Shape {
    
        private String name = "Square";
    
        public Square() {
            setType(name);
        }
    
        @Override
        void draw() {
            // 画图逻辑
        }
    }
    
    public class Client {
        private HashMap<String, Shape> showcase = new HashMap<>();
    
        public void register(String name, Shape shape) {
            showcase.put(name, shape);
        }
    
        public Shape create(String name) {
            Shape shape = showcase.get(name);
            try {
                return (Shape) shape.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    
  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/fomin/p/9842272.html
Copyright © 2011-2022 走看看