孩子生来没娘的NT审核机制,又开始说我涉及到广告了,我涉及到什么广告了?我接着发。

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

所属:创建型模式 

原型模式 一般会和 工场模式 组合。 

原型模式的定义与特点

原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。

原型模式的优点:

  • 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。

原型模式的缺点:

  • 需要为每一个类都配置一个 clone 方法
  • clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
  • 当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。

原型模式的结构与实现

C#提供了对象的 MemberwiseClone() 方法

1. 模式的结构

原型模式包含以下主要角色。

  1. 抽象原型类:规定了具体原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

其结构图如图 1 所示。

原型模式的克隆分为浅克隆和深克隆。

  • 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
  • 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
  • C#提供的MemberwiseClone()方法为浅克隆。

代码

using DesignPattern.PrototypePattern;
using System; namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
PrototypeHelper();
} #region Pattern - Prototype
static void PrototypeHelper()
{
ObjectProtoType _proto0 = new ObjectProtoType("Name_0");
ObjectProtoType _proto1 = (ObjectProtoType)_proto0.Clone();
ObjectProtoType _proto2 = (ObjectProtoType)_proto0.Copy(); Console.WriteLine("最开始 _proto0.Clone出_proto1 _proto0.Copy出_proto2 _proto0 的属行和字段值:");
Console.WriteLine($"Name = {_proto0.Name} Number = {_proto0.Number} aA.name = {_proto0.aA.name}");
Console.WriteLine(); _proto1.SetName("SetName_1");
_proto2.SetNumber(2321312);
_proto0.aA.name = "AAAAA"; Console.WriteLine("_proto1 修改了 Name 为:SetName_1");
Console.WriteLine("_proto2 修改了 Number 为:" + 2321312);
Console.WriteLine("_proto0 修改了 aA.name 为:AAAAA"); Console.WriteLine();
Console.WriteLine("结束时 全部 _proto 的属行和字段值:");
Console.WriteLine($"_proto0.Name = {_proto0.Name}\t\t\t_proto0.Number = {_proto0.Number}\t\t\t _proto0.aA.name = {_proto0.aA.name}");
Console.WriteLine($"_proto1.Name = {_proto1.Name}\t\t_proto1.Number = {_proto1.Number}\t\t\t _proto1.aA.name = {_proto1.aA.name}");
Console.WriteLine($"_proto2.Name = {_proto2.Name}\t\t\t_proto2.Number = {_proto2.Number}\t\t _proto2.aA.name = {_proto2.aA.name}");
Console.ReadLine();
}
#endregion
}
} //====================================================================================== using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; namespace DesignPattern.PrototypePattern
{
public interface IProtoType
{
object Copy();
object Clone();
} [Serializable]
public class ProtoType : IProtoType
{
public object Clone() => MemberwiseClone(); public object Copy()
{
using (var ms = new MemoryStream())
{
BinaryFormatter binaryFormatte = new BinaryFormatter();
binaryFormatte.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
return binaryFormatte.Deserialize(ms);
}
}
} [Serializable]
public class ObjectProtoType : ProtoType
{
public ObjectProtoType(string name)
{
Name = name;
}
public string Name;
public int Number = 0;
public AA aA = new AA("-----------aaa"); public void SetName(string name)
{
Name = name;
}
public void SetNumber(int number)
{
this.Number = number;
}
} [Serializable]
public class AA
{
public string name;
public AA(string name)
{
this.name = name;
}
}
}


希望大家:点赞,留言,关注咯~    

唠家常

  • Xiaohei.Wang(Wenhao)的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我的QQ:841298494 (记得备注),大家一起进步

今日推荐

GoF 的 23 种设计模式的分类和功能,这是Xiaohei自己总结的内容,会持续更新

创建型模式 - 原型模式Prototype的更多相关文章

  1. JAVA设计模式 2【创建型】原型模式的理解与使用

    在本节中,我们将学习和使用原型模式:这一节学习的原型模式也是创建型 模式的其中之一.再次复习一下:创建型 模式就是描述如何去更好的创建一个对象. 我们都知道,在JAVA 语言中.使用new 关键字创建 ...

  2. java设计模式--创建模式--原型模式

    原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...

  3. 设计模式01 创建型模式 - 原型模式(Protype Pattern)

    参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...

  4. 创建模式--原型模式(JAVA)

    原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...

  5. java-設計模式-原型模式

    原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...

  6. 【创建型】Builder模式

    生成器模式的主要思想:将产品对象的创建与表现分离开,并且同样的创建过程可以有不同的产品表现. 直白一点可以理解为:待创建的对象是复杂的,一般情况下是需要经过多个步骤的创建后,最终才能将完整产品创建好, ...

  7. 【创建型】Singleton模式

    单例模式可以说是所有23种设计模式中最为简单的一个,没有之一.其主要思想就是保证整个应用环境中,最多只会有一个对象的实例.类关系图参考如下: 在c++中,单例模式的实现,较为常用的实现方式一般为: n ...

  8. python设计模式---创建型之工厂模式

    # coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...

  9. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

  10. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

随机推荐

  1. Workflow,要不要了解一下

    摘要:Workflow本质是开发者基于实际业务场景开发用于部署模型或应用的流水线工具. Workflow(也称工作流,下文中均可使用工作流进行描述)本质是开发者基于实际业务场景开发用于部署模型或应用的 ...

  2. 几个实用 shell 脚本

    1. Dos攻击防范(自动屏蔽攻击 IP) #!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/demo2. ...

  3. python 类相关 下划线相关 __init__

    类 1.静态方法 class C(object): @staticmethod def f(): print('runoob'); C.f(); # 静态方法无需实例化 cobj = C() cobj ...

  4. Linux系统安装python

    1. 安装python3 1.1 下载python3安装包及其依赖包(该步骤可忽略,步骤1.2 提供应用包链接) ① 在python官网下载所需的python3,或者用外网centos机器的wget命 ...

  5. vue 项目中不更新的问题

    在项目中 做矩阵题  嵌套的v-for <!-- 多选矩阵题 --> <template v-if="question.name==='MATRIX_CHECKBOX'&q ...

  6. java学习之SpringMVC拦截器开发

    0x00前言 springmvc的拦截器类似于Selvet的Filter,但是所属的操作又不一样 Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理,也就是增强 ...

  7. AtCoder Beginner Contest 277 题解

    掉大分力(悲 A - ^{-1} 直接模拟. #include<bits/stdc++.h> #define IOS ios::sync_with_stdio(false) #define ...

  8. 单节点部署 gpmall 商城

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 1 修改主机名: [root@localhost ...

  9. 面试官:介绍一下 Redis 三种集群模式

    小码今天去面试. 面试官:给我介绍一下Redis集群, 小码:啊,平时开发用的都是单机Redis,没怎么用过集群了. 面试官:好的,出门右转不谢. 小码内心困惑:在小公司业务量也不大,单机的 Redi ...

  10. MySQL库,表,数据的操作

    数据库的操作 1. 创建数据库 create database [if not exists] `数据库名` charset=字符编码(utf8mb4); 如果多次创建会报错 如果不指定字符编码,默认 ...