原型模式(实例) 您所在的位置:网站首页 需求分析实例化举例 原型模式(实例)

原型模式(实例)

#原型模式(实例)| 来源: 网络整理| 查看: 265

目录 原型模式1、模式结构2、模式实例2.1 应用场景类图2.2 代码实现 3、模式分析3.1 优点3.2 缺点3.3 适用场景

原型模式

  原型模式是一种对象创建型模式,建造者模式是一种对象创建型模式,用原型模式可以用原型实例指定创建对象的种类,它允许通过一个原型对象创建多个同类型的其他对象,而无需知道该对象的创建细节,在Java中可以直接使用Object提供的clone()方法来实现对象的克隆(浅克隆)。

1、模式结构

在这里插入图片描述   Prototype:抽象原型类,给出所有的具体原型类所需的接口。   ConcretePrototype:具体原型类,被复制的对象,此角色需要实现抽象的原型角色所要求的接口。   Client:客户类。

2、模式实例

  当汽车生产商批量生产汽车时,可以对于一个汽车型号进行批量生产,原型模式实现该机制,浅克隆时需要对汽车品牌做调整时,无需修改原车型,修改克隆得到的对象即可,深克隆时批量生产汽车时,汽车品牌也批量生产。

2.1 应用场景类图

  原型模式浅克隆的应用类图如下:   原型模式深克隆的应用类图如下: 在这里插入图片描述

2.2 代码实现

浅克隆: (1)Brand.java

public class Brand { public void install(){ System.out.println("安装汽车品牌"); } }

(2)Car.java

public class Car implements Cloneable{ private Brand brand; public Car(){ this.brand = new Brand(); } @Override protected Object clone() { Car clone = null; try { clone = (Car)super.clone(); } catch (CloneNotSupportedException e) { System.out.println("克隆失败..."); } return clone; } public Brand getBrand(){ return this.brand; } public void run(){ System.out.println("小汽车能跑了"); } }

(3)Client.java

public class Client { public static void main(String[] args) { Car car,cloneCar; car = new Car(); cloneCar = (Car)car.clone(); System.out.println("car == cloneCar?"); System.out.println(car == cloneCar); System.out.println("car.getBrand() == cloneCar.getBrand()?"); System.out.println(car.getBrand() == cloneCar.getBrand()); } }

深克隆: (1)Brand.java

public class Brand implements Serializable{ private static final long serialVersionUID = 1L; public void install(){ System.out.println("安装汽车品牌"); } }

(2)Car.java

public class Car implements Serializable{ private static final long serialVersionUID = 1L; private Brand brand = null; public Car(){ this.brand = new Brand(); } public Object deepClone() throws IOException, ClassNotFoundException{ //将对象写入流中 ByteArrayOutputStream bao=new ByteArrayOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(bao); oos.writeObject(this); //将对象从流中取出 ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray()); ObjectInputStream ois=new ObjectInputStream(bis); return(ois.readObject()); } public Brand getBrand(){ return this.brand; } public void run(){ System.out.println("小汽车能跑了"); } }

(3)Client.java

public class Client { public static void main(String[] args) { Car car,cloneCar=null; car = new Car(); try { cloneCar = (Car) car.deepClone(); } catch (Exception e) { e.printStackTrace(); } System.out.println("car == cloneCar?"); System.out.println(car == cloneCar); System.out.println("car.getBrand() == cloneCar.getBrand()?"); System.out.println(car.getBrand() == cloneCar.getBrand()); } } 3、模式分析

  原型模式,在java中使用浅克隆时,当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制;而使用深克隆时,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。

3.1 优点

  原型模式简化了创建对象的过程,通过一个已有的实例进行复制提高了创建实例的效率,具有较好的可扩展性。

3.2 缺点

  部分时候实现克隆可能较为麻烦。

3.3 适用场景

  原型模式适合于当一个类初始化需要消耗很多资源时,有很多相似对象时,可以设计一个原型,通过对成员变量的些微修改来实现;需要时可以用深克隆的方式保存对象的状态,比如实现撤销操作等。

参考文献:设计模式(第2版).清华出版社



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有