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;
        }
    }
    
  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/fomin/p/9842272.html
Copyright © 2011-2022 走看看