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();
            }
        }
    }

     

  • 相关阅读:
    css中margin-left与left的区别
    Python文件和目录模块介绍:glob、shutil、ConfigParser
    [ Python入门教程 ] Python文件基本操作_os模块
    使用Pyinstaller转换.py文件为.exe可执行程序
    Windows命令行打开常用界面
    如何做好性能测试_流程篇
    Windows查看指定端口是否占用和查看进程
    ‘操作无法完成 ,因为其中的文件夹或文件已在另一程序中打开’问题解决
    bat脚本基础教程
    vi编辑器常用命令
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10211306.html
Copyright © 2011-2022 走看看