`

构造型模式

 
阅读更多
Builder(生成器)模式

Factory Method(工厂方法)模式

意图:用于创建对象的接口,同时控制对哪个类进行实例化。


Abstract Factory(抽象工厂)模式

意图:创建一系列相互关联或相互依赖的对象。

Prototype(原型)模式

prototype模式不通过实例化类来创建一个新的未初始化的实例,而是通过复制一个现有对象来生成新的对象。


浅拷贝
public class PackageInfo implements Cloneable {
    private Long id;
    private String receiverName;
    private String receiverAddress;
    private String senderName;
    private String senderPhoneNo;

    //other fields, getters, setters and other methods...


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getReceiverName() {
        return receiverName;
    }

    public void setReceiverName(String receiverName) {
        this.receiverName = receiverName;
    }

    public String getReceiverAddress() {
        return receiverAddress;
    }

    public void setReceiverAddress(String receiverAddress) {
        this.receiverAddress = receiverAddress;
    }

    public String getSenderName() {
        return senderName;
    }

    public void setSenderName(String senderName) {
        this.senderName = senderName;
    }

    public String getSenderPhoneNo() {
        return senderPhoneNo;
    }

    public void setSenderPhoneNo(String senderPhoneNo) {
        this.senderPhoneNo = senderPhoneNo;
    }

    public PackageInfo clone() {
        try {
            return (PackageInfo)super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("Cloning not allowed.");
            return null;
        }
    }


    public static PackageInfo clonePackage(String userName) {
        //load package as prototype data from db...
        PackageInfo prototype = loadPackageInfo(userName);

        //clone information...
        prototype = prototype.clone();

        //initialize copied data...
        prototype.setId(null);

        return prototype;
    }

    //Simulate loading data from database
    private static PackageInfo loadPackageInfo(String userName) {
        PackageInfo packageInfo = new PackageInfo();

        //create a String object in jvm heap not jvm string pool
        packageInfo.setId(100l);
        packageInfo.setReceiverName("John");
        packageInfo.setReceiverAddress("People Square,Shanghai");
        packageInfo.setSenderName("William");
        packageInfo.setSenderPhoneNo("12345678901");
        return packageInfo;
    }
}
public class PackageInfoTestDrive {
    public static void main(String[] args) {
        PackageInfo currentInfo = PackageInfo.clonePackage("John");
        System.out.println("Original package information:");
        display(currentInfo);

        currentInfo.setId(10000l);
        currentInfo.setReceiverName("Ryan");
        currentInfo.setReceiverAddress("People Square, Shanghai");

        System.out.println("\nNew package information:");
        display(currentInfo);
    }

    private static void display(PackageInfo currentInfo) {
        System.out.println("Package id: " + currentInfo.getId());
        System.out.println("Receiver name: " + currentInfo.getReceiverName());
        System.out.println("Receiver address: " + currentInfo.getReceiverAddress());
        System.out.println("Sender name: " + currentInfo.getSenderName());
        System.out.println("Sender Phone No.: " + currentInfo.getSenderPhoneNo());
    }
}

深拷贝(Deep Copy)
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class DeepCopyBean implements Serializable {
    private String objectField;
    private int primitiveField;

    public String getObjectField() {
        return objectField;
    }

    public void setObjectField(String objectField) {
        this.objectField = objectField;
    }

    public int getPrimitiveField() {
        return primitiveField;
    }

    public void setPrimitiveField(int primitiveField) {
        this.primitiveField = primitiveField;
    }

    public DeepCopyBean deepCopy() {
        try {
            ByteArrayOutputStream buf = new ByteArrayOutputStream();
            ObjectOutputStream o = new ObjectOutputStream(buf);
            o.writeObject(this);

            ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
            return (DeepCopyBean) in.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
public class DeepCopyBeanTestDrive {
    public static void main(String[] args) {
        DeepCopyBean originalBean = new DeepCopyBean();

        //create a String object in jvm heap not jvm string pool
        originalBean.setObjectField(new String("123456"));
        originalBean.setPrimitiveField(2);

        //clone this bean
        DeepCopyBean newBean = originalBean.deepCopy();

        System.out.println("Primitive ==? " + (newBean.getPrimitiveField() == originalBean.getPrimitiveField()));
        System.out.println("Object ==? " + (newBean.getObjectField() == originalBean.getObjectField()));
        System.out.println("Object equal? " + (newBean.getObjectField().equals(originalBean.getObjectField())));
    }
}



Memento(备忘录)模式

意图:为对象提供状态存储和状态恢复功能。

  • 大小: 51 KB
分享到:
评论

相关推荐

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163...

    java设计模式 创建型 构造型 行为型

    构造型 用于帮助将多个对象组织成更大的结构。如,适配器模式、桥接模式、组合器模式等。 行为型 用于帮助系统间对象的通信,以及如何控制复杂系统中的流程。如,命令模式、解释器模式、迭代器模式等。

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造者模式10 1.1.4 单态模式13 1.1.5 原型模式15 1.2 构造型模式17 1.2.1 适配器模式17 1.2.2 桥接模式19 1.2.3 组合模式23 1.2.4 装饰模式26 ...

    基于构造型神经网络的异常模式发现方法.pdf

    基于构造型神经网络的异常模式发现方法.pdf

    基于仿生模式识别的构造型神经网络分类方法.pdf

    基于仿生模式识别的构造型神经网络分类方法.pdf

    论文研究-基于仿生模式识别的构造型神经网络分类方法.pdf

    从BP神经元模型和RBF神经元模型几何意义出发,将仿生模式识别理论引入到神经网络分类中,提出了一种基于仿生模式识别的构造型神经网络分类方法,通过构造不同结构神经元结合的神经网络,实现了对不同类样本在高维...

    基于仿生模式识别的构造型神经网络分类方法分析.pdf

    基于仿生模式识别的构造型神经网络分类方法分析.pdf

    浅析软件项目开发中的单件模式

    火龙果软件工程技术中心 前言单件(Singleton)模式作为设计模式的一个典型且相对简单的构造型模式,已经在很多项目的实际开发中被广泛采用,由于其所有相关操作都是基于同一个实例的引用,因此单件模式的使用主要...

    Java优良的Adapter模式:适配器模式

    Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。  在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:  我们需要实现某些功能,这些功能已有还不太成熟的一个...

    Scala程序设计(第2版)

    23.4.1 构造型模式 443 23.4.2 结构型模式 443 23.4.3 行为型模式 444 23.5 契约式设计带来更好的设计 446 23.6 帕特农神庙架构 448 23.7 本章回顾与下一章提要 453 第24章 元编程:宏与反射 ...

    【J2EE核心模式】——J2EE模式概览

    同一个模式模式vs策略 || || 抽象 实现分层思路J2EE模式表现层模式业务层模式集成层模式J2EE模式目录指南术语UML的使用 类图——静态视图 序列图——动态视图 构造型(stereotypes)——表现在类图和交互图中...

    一种新的基于构造型RBF神经元网络分类算法

    依据RBF神经元模型的几何解释,提出一种新的构造型神经网络分类算法.首先从样本数据本身入手,通过引入一个密度估计函数来对样本数据进行聚类分析;然后在特征空间里构造超球面, 以逼近样本点分布的几何轮廓,从而将神经...

    基于构造型神经网络的分类算法 (2009年)

    提出一种基于构造型神经网络的最大密度覆盖分类算法,以便更加有效地解决模式识别的问题。首先,引入一个密度估计函数,用该函数对样本数据进行聚类分析,找出同类样本中具有最大密度的样本数据点,然后,在特征空间里作超...

    Java设计模式演讲稿PPT

    内容:主要讲解Java中的三种类型的设计模式:创建型;行为型;构造型。一共23种设计模式;还有5大设计原则;以及UML类图;

    UML和模式应用期末复习资料

    构造型的作用是什么? 应用UML的三种透视图是什么? 请简要解释主动类的概念,并说明它建模的意义? 什么是敏捷开发? 请说明对象图的适用场景以及它的优缺点? 什么是UP的阶段? 用例和使用场景之间是什么关系?...

    深部开采底板破坏及高承压突水模式、前兆与防治

    以大量突水资料为背景,分析了底板突水的形成及影响因素、水岩相互作用、时空分布及规律,总结了底板突水的两类基本模式,即完整型底板突水模式和断裂构造型底板突水模式。采用现场实测、数值模拟及物理模拟等手段,揭示...

Global site tag (gtag.js) - Google Analytics