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

    一、定义

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

    二、类型

     创建型

    三、适用场景

    • 资源优化,初始化类需要消耗非常多的资源,资源包括数据、硬件等。
    • 性能和安全要求场景,通过new产生一个对象需要非常繁琐的数据准备或访问权限。
    • 一个对象多个修改者的场景,一个对象提供给其他对象访问,而且各个调用者都可能修改这个对象的值是,可以考虑使用原型模式拷贝多个对象供调用者使用。

    四、优点

    • 原型模式是在内存中进行二进制流的拷贝,要比new一个对象性能好很多,特别是在循环体里要创建大量的对象时。
    • 逃避构造函数的约束,直接在内存中拷贝,构造函数是不会执行的,这既是缺点又是优点,需要考虑实际应用场景。

    五、缺点

    • 必须实现Cloneable接口,并重写Object类的clone()方法。
    • 克隆容易出现风险,深拷贝和浅拷贝要特别注意。

    六、类图

     

    七、代码实现

    要实例化的类:

    package com.wms.createtype.prototype;
    
    public class Mail implements Cloneable {
        private String subject;
        private String receiver;
        private String content;
    
        public Mail(MailTemplate mailTemplate) {
            this.subject = mailTemplate.getSubject();
            this.content = mailTemplate.getContent();
        }
    
        public String getSubject() {
            return subject;
        }
    
        public void setSubject(String subject) {
            this.subject = subject;
        }
    
        public String getReceiver() {
            return receiver;
        }
    
        public void setReceiver(String receiver) {
            this.receiver = receiver;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public void sendEmai() {
            System.out.println("主题:" + this.subject + ",收件人:" + this.receiver + ",内容:" + this.content);
        }
    
        @Override
        protected Mail clone() throws CloneNotSupportedException {
            return (Mail) super.clone();
        }
    }

     模板类,在这个例子中辅助作用:

    package com.wms.createtype.prototype;
    
    public class MailTemplate {
        private String subject;
        private String content;
    
        public MailTemplate(String subject, String content) {
            this.subject = subject;
            this.content = content;
        }
    
        public String getSubject() {
            return subject;
        }
    
        public void setSubject(String subject) {
            this.subject = subject;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }

     测试类:

    package com.wms.createtype.prototype;
    
    public class TestDesignPattern {
        public static void main(String[] args) throws CloneNotSupportedException {
            Mail mail = new Mail(new MailTemplate("this is subject", "this is content"));
            for (int i = 0; i < 10; i++) {
                Mail tempMail = mail.clone();
                tempMail.setReceiver("receiver" + i);
                tempMail.sendEmai();
            }
        }
    }

     

  • 相关阅读:
    判断 iframe 是否加载完毕
    iframe跨端口报错 Blocked a frame with origin from accessing a cross-origin frame
    React与Vue
    原生js监听input值发生变化
    防抖函数与节流函数
    原生js 实现better-scroll效果,饿了么菜单内容联动,即粘即用
    力扣数据库的一些题解
    动态代理
    一个能够进行增删改查的数组的构建(数据结构01)
    c语言学习笔记(1)
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10211306.html
Copyright © 2011-2022 走看看