设计模式(十五):原型模式

  早就发现java父类有个方法clone(),但一直没用过,也不知道怎么用。直到学习了原型设计模式才明白,他就是克隆方法,专门用来复制对象的。虽然到目前为止还没真正在项目中用到,但克隆方法还是挺有用的,它为我们创建相同对象带来了很大的便利,只要克隆一下就可以拥有一个全新的、初始值跟父类一样的对象。

一、概述

  原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。看这些翻译过来的解释确实好别扭,简单理解就是复制对象,得到全新对象,这个全新对象拥有了跟老对象一样的属性值和方法。

二、结构类图

三、应用实例

  没想到更通俗易懂的例子了,就用大话设计模式的例子讲解原型模式吧。大家求职面试都会用到简历,简历书写完毕就很少改动了,应聘不同的公司可以打印一样的简历,我们把打印简历的过程应用到代码层面就是原型模式了。

  1、定义简历抽象类

package com.jet.pattern.prototype;

import com.jet.pattern.prototype.impl.WorkExperience;

/**
 * description:
 * 定义简历抽象类(有成员变量和未实现的方法定义抽象类就好)
 * Created by Administrator on 2017/2/20.
 */
public abstract class Resume {
    // 名字
    private String name;
    // 性别
    private String sex;
    // 工作经历
    private WorkExperience workExperience ;
    // 未实现的克隆方法,抛出不支持克隆异常
    public abstract Resume Clone() throws CloneNotSupportedException;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public WorkExperience getWorkExperience() {
        return workExperience;
    }

    public void setWorkExperience(WorkExperience workExperience) {
        this.workExperience = workExperience;
    }
}

  2、定义工作经历类

package com.jet.pattern.prototype.impl;

/**
 * description:
 * 工作经历类
 * Created by Administrator on 2017/2/20.
 */
public class WorkExperience {
    // 时间
    private String time;
    // 公司
    private String company;
    // 岗位
    private String position;

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }
}

  3、实现简历类

package com.jet.pattern.prototype.impl;

import com.jet.pattern.prototype.Resume;

/**
 * description:
 * 我的简历实现类,需要实现java的Cloneable接口和自定义的Resume接口
 * Created by Administrator on 2017/2/20.
 */
public class MyResume  extends Resume implements Cloneable{
    // 实现克隆方法,直接用java父类自带的克隆方法
    @Override
    public Resume Clone() throws CloneNotSupportedException {
        return (Resume)this.clone();
    }
}

  4、测试类

package com.jet.pattern.prototype.test;

import com.jet.pattern.prototype.Resume;
import com.jet.pattern.prototype.impl.MyResume;
import com.jet.pattern.prototype.impl.WorkExperience;

/**
 * description:
 * 测试类
 * Created by Administrator on 2017/2/20.
 */
public class MyTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 创建我的简历
        Resume resume = new MyResume();
        resume.setName("张晓明");
        resume.setSex("男");
        WorkExperience workExperience = new WorkExperience();
        workExperience.setTime("2014/08/10-2016/08/20");
        workExperience.setCompany("智信科技有限公司");
        workExperience.setPosition("JAVA开发工程师");
        resume.setWorkExperience(workExperience);

        // 克隆简历
        Resume resume1 = resume.Clone();

        // 打印简历
        System.out.println("----打印简历-----");
        System.out.println(resume1.getName());
        System.out.println(resume1.getSex());
        System.out.println(resume1.getWorkExperience().getTime() + " " +
                resume1.getWorkExperience().getCompany() + " " +
                resume1.getWorkExperience().getPosition());

    }
}

  5、测试结果

四、总结

  原型模式就是为我们创建相同对象带来便利的,只要有了一个原型对象,之后要创建对象就不用每次都new了,也不用给新创建的对象赋值了,直接调用克隆方法就可以拥有无数可用对象。上面例子中,只要在打印简历代码部分来个for循环,无穷无尽的对象就有了,哈哈。

  原型模式中有深度克隆和浅克隆,在浅克隆中需要考虑成员变量对象是否为原生对象(String,Integer等是原生对象),如果是非原生对象还需要层层克隆。而java父类的clone()方法是深度克隆的,我们在例子中也看到了,并没有层层克隆,所以浅克隆就不需过多了解了,java就是那么强大。

  其实在java中,自定义的类只要实现了java自带的Cloneable接口就可以被克隆了,并不需要我们自定义一个Clone()方法,本博文是为了讨论原型模式的原理才如此做,在现实项目中不用这般复杂。

时间: 2024-10-15 12:35:18

设计模式(十五):原型模式的相关文章

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

Java描述设计模式(05):原型模式

一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建. 3.代码实现 1).UML关系图 Java描述设计模

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

Java设计模式菜鸟系列(十六)原型模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39997337 原型模式(Prototype):该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.而这里的复制有两种:浅复制.深复制. 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的. 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的.简单来说,就是深复制进行了完全彻底的复制,而浅复

4.泡妞与设计模式(五) 原型模式

PROTOTYPE 原型模式 原型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构.缺点是每一个类都必须配备一个克隆方法.(简单点说就是调用的都可以找到原型,比如你和MM聊天,事先设计好一些情话,需要的时候copy就可以了,这时候情话就是原型) 原型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象. 代码示例 1 #include <stdio.h> 2 #include <

从王者荣耀看设计模式(十七.原型模式)

从王者荣耀看设计模式(原型模式) 一.简介 王者荣耀包含有很多的玩法,其中有一种游戏模式只在周六和周日开放,那就是--克隆模式.与常规的游戏双方阵营只允许出现单一英雄不同,在克隆模式中,双方各选择一个英雄进行克隆,换句话说,一个阵营的五个人操作的五个相同的英雄 二.模式动机 在软件系统中,有些对象的创建过程比较复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在. 三.原型模式 原型模式

php设计模式 四 (观察者 原型模式 迭代器模式)

观察者模式 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 当一个对象的状态发生改变时,依赖他的对象全部会接到通知,并自动更新.观察者模式实现了低耦合 非入侵式的通知与更新机制. 观察者模式示例: 首先创建一个事

《Java设计模式》之原型模式

原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建. 原型模式有两种表现形式:(1)简单形式.(2)登记形式,这两