论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
【23种设计模式】原型模式(五)
【23种设计模式】原型模式(五)
盛世宏图
金牌会员
|
2023-9-3 00:25:09
|
显示全部楼层
|
阅读模式
楼主
主题
884
|
帖子
884
|
积分
2652
前言
在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度。如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相应工厂类的增加,维护的代码维度增加了,因为有产品和工厂两个维度了,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适。由于每个类实例都是相同的,这个相同指的是类型相同,但是每个实例的状态参数会有不同,如果状态数值也相同就没意义了,有一个这样的对象就可以了。当我们需要多个相同的类实例时,可以通过对原来对象拷贝一份来完成创建,这个思路正是原型模式的实现方式。
原型模式的定义
在软件系统中,经常面临着
“某些结构复杂的对象”
的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?那就是
原型模式
,使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
原型模式的组成
原型类(Prototype)
:原型类,声明一个Clone自身的接口;
具体原型类(ConcretePrototype)
:实现一个Clone自身的操作。
在原型模式中,Prototype通常提供一个包含Clone方法的接口,具体的原型ConcretePrototype使用Clone方法完成对象的创建。
原型模式的实现
《大话西游之大圣娶亲》这部电影,没看过的人不多吧,里面有这样一个场景。牛魔王使用无敌牛虱大战至尊宝,至尊宝的应对之策就是,从脑后把下一撮猴毛,吹了口仙气,无数猴子猴孙现身,来大战牛魔王的无敌牛虱。至尊宝的猴子猴孙就是该原型模式的最好体现。至尊宝创建自己的一个副本,不用还要重新孕育五百年,然后出世,再学艺,最后来和老牛大战,估计黄花菜都凉了。他有3根救命猴毛,轻轻一吹,想要多少个自己就有多少个,方便,快捷。
抽象原型
/// <summary>
/// 抽象原型,定义了原型本身所具有特征和动作,该类型就是至尊宝
/// </summary>
public abstract class Prototype
{
/// <summary>
/// 战斗--保护师傅
/// </summary>
public abstract void Fight();
/// <summary>
/// 化缘--不要饿着师傅
/// </summary>
public abstract void BegAlms();
/// <summary>
/// 吹口仙气--变化一个自己出来
/// </summary>
/// <returns></returns>
public abstract Prototype Clone();
}
复制代码
具体原型
创建两个具体原型:行者孙和孙行者
行者孙:
/// <summary>
/// 具体原型,例如:行者孙,他只负责化斋饭食和与天界宠物下界的妖怪的战斗
/// </summary>
public sealed class XingZheSunPrototype : Prototype
{
/// <summary>
/// 战斗--保护师傅--与自然修炼成妖的战斗
/// </summary>
public override void Fight()
{
Console.WriteLine("行者孙:腾云驾雾,与天界宠物下界的妖怪的战斗....");
}
/// <summary>
/// 化缘--不要饿着师傅--饭食类
/// </summary>
public override void BegAlms()
{
Console.WriteLine("行者孙:化缘鸡鱼肉蛋....");
}
/// <summary>
/// 吹口仙气--变化一个自己出来
/// </summary>
/// <returns></returns>
public override Prototype Clone()
{
return (XingZheSunPrototype)this.MemberwiseClone();
}
}
复制代码
孙行者:
/// <summary>
/// 具体原型,例如:孙行者,他只负责与自然界修炼成妖的战斗和化斋水果
/// </summary>
public sealed class SunXingZhePrototype : Prototype
{
/// <summary>
/// 战斗--保护师傅-与天界宠物战斗
/// </summary>
public override void Fight()
{
Console.WriteLine("孙行者:腾云驾雾,与自然界修炼成妖的战斗....");
}
/// <summary>
/// 化缘--不要饿着师傅---水果类
/// </summary>
public override void BegAlms()
{
Console.WriteLine("孙行者:化缘水果....");
}
/// <summary>
/// 吹口仙气--变化一个自己出来
/// </summary>
/// <returns></returns>
public override Prototype Clone()
{
return (SunXingZhePrototype)this.MemberwiseClone();
}
}
复制代码
调用
public void RunTest()
{
//原型行者孙
Prototype xingZheSun = new XingZheSunPrototype();
Prototype xingZheSun2 = xingZheSun.Clone();
Prototype xingZheSun3 = xingZheSun.Clone();
//1号行者孙打妖怪
xingZheSun.Fight();
//2号行者孙去化缘
xingZheSun3.BegAlms();
Console.WriteLine("\r\n*****************************\r\n");
//原型孙行者
Prototype sunXingZhe = new SunXingZhePrototype();
Prototype sunXingZhe2 = sunXingZhe.Clone();
Prototype sunXingZhe3 = sunXingZhe.Clone();
Prototype sunXingZhe4 = sunXingZhe.Clone();
Prototype sunXingZhe5 = sunXingZhe.Clone();
//1号孙行者打妖怪
sunXingZhe.Fight();
//2号孙行者去化缘
sunXingZhe2.BegAlms();
//战斗和化缘也可以分类,比如化缘,可以分:水果类化缘,饭食类化缘;战斗可以分为:天界宠物下界成妖的战斗,自然修炼成妖的战斗,大家可以自己去想吧,原型模式还是很有用的
}
复制代码
原型模式的优缺点
优点
原型模式向客户隐藏了创建新实例的复杂性。
原型模式允许动态增加或较少产品类。
原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。
产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构。
缺点
每个类必须配备一个克隆方法。
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
盛世宏图
金牌会员
这个人很懒什么都没写!
楼主热帖
绝了,这20款可视化大屏模板太酷炫了( ...
【十年网络安全工程师整理】—100渗透 ...
零基础学Java(1)初识Java程序 ...
Python程序运行内存的查看
聊聊DevOps制品管理-不止是存储制品这 ...
记一次 .NET 某RFID标签管理系统 CPU ...
数据库扩容也可以如此丝滑,MySQL千亿 ...
lamp
Frida主动调用java函数来爆破解题思路 ...
【Linux进程概念——下】验证进程地址 ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表