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

    使用频率:★★★☆☆

    一、什么是原型模式

    通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型;

    二、补充说明

    1、JAVA中Object的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,在需要大量复制对象的情况,使用clone创建对象比new效率高;

    补充下深拷贝和浅拷贝,深拷贝是通过拷贝内存(包括引用的对象)实现对象的创建;浅拷贝不拷贝引用的对象,但拷贝了引用的值,如果类的成员属性中都是基本类型,不含对象,也是可以达到深拷贝的效果;深拷贝可以通过将对象序列化成字节流以及反序列化实现,浅拷贝直接调用clone即可;

    2、使用原型模式创建对象是没有调用类的构造方法的;

    三、角色

    原型角色(ps,也可以搞成两个,如抽象原型角色以及各个具体实现原型角色)

    四、JAVA实现例子

    java已经很好的支持原型模式了,使用很简便,如下类,实现了Cloneable接口,即成了一个原型;

    package com.pichen.dp.creationalpattern.prototype;
    
    public class Cell implements Cloneable{
        private int cellId;
        public int getCellId() {
            return cellId;
        }
        public void setCellId(int cellId) {
            this.cellId = cellId;
        }
        public Cell(int id) {
            this.cellId = id;
        }
        @Override
        public Object clone() throws CloneNotSupportedException
        {
            System.out.println("clone a cell obj.");
            return (Cell) super.clone();
        }
    }

    使用原型,复制10个拷贝:

    package com.pichen.dp.creationalpattern.prototype;
    
    public class Main {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            Cell prototypeCell = new Cell(888);
            for(int i = 0; i < 10; i++){
                Cell copyCell = (Cell) prototypeCell.clone();
                System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId());
            }
        }
    }

    观察打印结果,hashcode不同,对象成员属性一致,复制成功:

    clone a cell obj.
    25840096:888
    clone a cell obj.
    33040770:888
    clone a cell obj.
    23930419:888
    clone a cell obj.
    15142448:888
    clone a cell obj.
    22316618:888
    clone a cell obj.
    3969559:888
    clone a cell obj.
    10175206:888
    clone a cell obj.
    21307627:888
    clone a cell obj.
    24389376:888
    clone a cell obj.
    11317592:888
  • 相关阅读:
    String StringBuffer StringBuild的区别
    String比较涉及知识点 实例
    maven build失败 (Failure to find io.renren:renren-security:pom:3.2.0 in http://maven.aliyun.com/nexus/content/groups/public/ was cached in the local repository...)
    mysql压缩包安装相关过程命令
    FastDFS搭建单机图片服务器(二)
    FastDFS搭建单机图片服务器(一)
    JDK8 parallelStream性能测试
    idea 获取resources资源目录下文件
    idea / eclipse 批量 替换 空白行
    阻塞队列 BlockingQueue 常用方法详解
  • 原文地址:https://www.cnblogs.com/chenpi/p/5183688.html
Copyright © 2011-2022 走看看