23种设计模式(4) - 原型模式

1、定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2、UML图

3、组成

  • 原型类:用来作拷贝的类,实现了Cloneable类,并重写了 clone方法。重写Cloneable方法才能使用clone方法,否则会报CloneNotSupportedException的异常;重写clone方法是因为该方法原来是protected类型的,不重写不能调用该方法。

4、代码

// 原型类
public class Prototype implements Cloneable {
    private String name;
  	// 引用类型变量
    private Car car;

    @Override
    protected Prototype clone() throws CloneNotSupportedException {
        Prototype prototype = (Prototype) super.clone();
        // 引用类型需要深复制
        prototype.car = (Car) car.clone();
        return prototype;
    }

    public Prototype(String name, Car car) {
        this.name = name;
        this.car = car;
    }

    // get、set方法省略 ...

    public void show(){
        System.out.println("我的名字:" + name  + ":::::: 车的名字:" + car.getName());
    }
}

public class Car implements Cloneable{
    private String name;

    public Car(String name) {
        this.name = name;
    }

  	// get、set方法省略 ...

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// 引用类
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Prototype prototype = new Prototype("原型1", new Car("原型1的CAR"));
        Prototype prototype2 = prototype.clone();
      	// 修改引用类的属性,看是否会影响第一个类
        prototype2.getCar().setName("原型2的CAR");

        prototype.show();
        prototype2.show();
    }
}

运行结果:

我的名字:原型1:::::: 车的名字:原型1的CAR
我的名字:原型1:::::: 车的名字:原型2的CAR

5、优缺点

  • 使用原型模式比直接new一个对象的性能要好的多,因为clone方法是Java本地方法,它直接操作二进制流来创建对象,特别是复制大对象时,性能相差较明显。
  • 需要注意,原型模式是直接在内存中操作二进制数据流的,不会去执行构造方法,而且类变量的访问权限级别也能被忽略。
  • 深拷贝与浅拷贝:Object类的clone方法只会拷贝对象中的基本的数据类型(基本类型及封装类型,String类型也会被拷贝),对于数组、容器对象、引用对象等都不会拷贝,只会复制对象的引用,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。

6、适用场景

如果项目中要频繁复制新对象,或是被复制对象比较复杂,可以考虑原型模式。

原文地址:https://www.cnblogs.com/moongeek/p/12563357.html

时间: 2024-10-09 06:43:18

23种设计模式(4) - 原型模式的相关文章

23种设计模式之原型模式(Prototype)

在系统开发过程中,有时候有些对象需要被频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的办法,创建出更多同类型的对象.原型模式是一种对象创建型模式,用原型实例制定创建对象的种类,并且通过复制这些原型创建新的对象.原型模式又可分为两种:浅克隆和深克隆.浅克隆仅仅复制所考虑的对象,而不复制它所引用的对象,也就是其中的成员对象并不复制:深克隆除了对象本身被复制外,对象包含的引用也被复制,即成员对象也被复制. 优点: 1)可以在运行时添加或删除产品. 2)通过改

【Unity与23种设计模式】原型模式(Prototype)

GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其存储为Prefab类型的Unity Asset资源 程序代码中使用的实例化方法(GameObject.Instance) 就是一种原型模式的应用. 原型模式原意为: 将一个复杂对象的组合方式先行设置好 后续使用时就不必再经过相同的组装流程 只需要从做好的"原型"完整地复制出来就可以了.

Java经典23种设计模式之创造型模式(二)

本文记录5种创造型模式的剩下两种:建造者模式(Builder).原型模式(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示.一个完整的建造者模式包含以下几个概念: 1.产品类 Product public class Person { private String head; private String body; private String foot; public String getHead() { ret

JAVA开发的23种设计模式之 --- 桥接模式

桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多个角度分类,每一种角度都可能变化.    解释:桥接模式将继承模式转化成关联关系,他降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量.    理解抽象化,实现化,解耦        抽象化:将复杂物体的一个或几个共同的特性抽出去而只注意其他特性的行动或过程.在java面向对象中抽象化就

Java经典23种设计模式之创造型模式(一)

设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过.故此次在这里总结下.值得一提的是,设计模式并不是Java所特有.由于一直搞Android.这里就用Java为载体.最经典的设计模式有23种,分三个大类型: 创建型模式(5) .结构型模式(7).行为型模式(11),5 + 7 +11 = 23.网上一搜也都是一大把了,这里不过个人作的记录.本文记录创造型模式里的工厂方法(Factory Method).抽象工厂(Abstract Factory).单例模式这三种.力求透彻.

c# 24种设计模式5原型模式(Prototype)

前言 原型模式其实C# Object中已经提供了一个Clone( )方法,平时很少用到,最近读Retrofit源码时候看到有这种使用方式. 定义 原型模式就是在系统clone()标记的基础上,对Clone()进行复写,不同的操作可以产生两种拷贝模式. 例子一场景 是个java的, 只是介绍使用的场景 UML类图 今天我们来讲原型模式,这个模式的简单程度是仅次于单例模式和迭代器模式,非常简单,但是要使 用好这个模式还有很多注意事项.我们通过一个例子来解释一下什么是原型模式. 现在电子账单越来越流行

23种设计模式(19)---Command模式

命令(Command)模式属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象. 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作:接收的一方收到请求,并执行操作.命令模式允许请求的一方和接收的

23种设计模式----创建型模式

创建型模式的主要关注点是:如何创建对象?它主要目的是将对象的创建和使用分离.其中包括: 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式. 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例. 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品. 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生

二十三种设计模式之原型模式的C#实现

原型模式就是通过拷贝快速创建一个新的对象 本例UML如图 ColorBase [Serializable] public abstract class ColorBase { public int R = 0; public int G = 0; public int B = 0; public virtual ColorBase Clone() { return this; } public virtual void ShowMe() { Console.WriteLine(string.Fo