【设计模式学习笔记1】原型法
设计模式不是代码的复用,而是经验的复用。要经过分析之后确定哪个是抽象,那个是具体。
依赖关系的倒置:
抽象不应该依赖于细节,实现细节应该依赖于抽象。
反之软件易碎。
人是抽象A,陶瓷水杯可以是一个实现细节b。即人拿一个水杯。但是陶瓷水杯是一个易变类,因此转化成下面的图。把它的实现分解成两种,一个抽象,一个具体。即先分解成一个水杯,水杯是抽象部分。再分解的一部分是陶瓷水杯,具体实现部分。而人只需要依赖于抽象的水杯,这样系统中可以任意的更换水杯的类型。
依赖倒置的原则是抽象变化慢,细节变化快。
转化为
人是抽象A,
面向对象三大特性:
继承、多态、封装。可以实现更好地依赖关系
原型设计模式(Prototype)
动机:
在软件系统中,经常面临某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着巨大的变化,但是他们却拥有比较稳定一致的借口。
客户程序 A使用B,A就是B的客户程序。
如何将客户程序隔离出这些易变对象,从而使得 依赖这些易变对象的客户程序 不随着需求的改变儿改变?
结构:
Clint是GameSystem,Prototype是NormalActor,ConcreatePrototype1就是normalActor1
意图:
使用原型实例(如normalActor)来创建对象,然后通过拷贝来创建新的对象。
例子:
Public class GameSystem
{
public static void Run(){
NormalActor normalActor1 = new NormalActorA();
NormalActor normalActor2 = new NormalActorB();
FlyActor flyActor = new FlyActor();
}
}
这是正常的方法。
声明类型和实现类型是同一个类型,这就是抽象依赖具体的表现,应该摒弃。
public abstract class NormalActor{
}
public abstract class FlyActor{
}
public abstract class WaterActor{
}
public class NormalActorA:NormalActor{
public override NormalActor Clone(){
return (NormalActorA)this.MemberwiseClone();
//利用了.NET的克隆方法,按照成员浅拷贝。所有值类型都没有问题,但是如果出现如数组这种类型,
//则拷贝过去的只是数组的地址
//深克隆就是没有共享部分,相互不影响
}
}
//NormalActorB等等也是如此,这样细节B依赖于抽象B
Public class GameSystem
{
public static void Run(NormalActor normalActor,
FlyActor flyActor,
WaterActor waterActor)
{
NormalActor normalActor1 = normalActor.Clone();
NormalActor normalActor2 = normalActor.CloneA();
FlyActor flyActor1 = flyActor.Clone();
WaterActor waterActor1 = waterActor.Clone();
}
}
这样GameSystem就不用依赖于各种Actor的子类。现在就是抽象A依赖于抽象B
class App{
public static void Main(){
GameSystem gameSystem = new GameSystem;
gameSystem.Run(new NormalActorA(),
new FlyActorB(),
new WaterAcotorC());
//程序主逻辑不变,参数可以变化。
}
}
要点:
Prototype模式要求这些“易变类”拥有“稳定的借口”
原型法模式对于如何创建易变类的实体对象采用原型克隆的方法来做,它使得我们可以非常灵活的创建 拥有某些稳定借口 的新对象,所需工作紧紧是注册一个新类的对象。然后在人需要的地方不断地克隆。
创建型模式的讨论:
Singleton模式解决的是实体对象个数的问题。出了singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
工厂(一个对象)、抽象工厂(对个关联对象)和Builder(利用复杂的算法创建组合对象)都需要一个额外的工厂类来负责实例化“易变对象”,儿Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。
如果遇到“易变类”,起初的设计从Factory Method开始,当遇到更多复杂的变化时,再刻意考虑重构为其他三种工厂模式(Abstract Factory,Builder,Prototype)。
Prototype最好是方便克隆的,可以通过加序列化的方式来方便克隆。
下面再以老师的代码样子做解释:
#include <iostream>
using namespace std;
class Prototype//如同NormalActor
{public:int abc;virtual void func(){cout<<"prototype func";}virtual Prototype* Clone(){return new Prototype(*this);}//原型的克隆方法,虚函数,目的为了子类的重写Prototype(int n){abc=n;}Prototype(const Prototype& p){abc=p.abc;}
};
class ConcretePrototype:public Prototype//如NormalActor1
{public:int conabc;void func(){cout<<"ConcretePrototype func conabc="<<conabc;}Prototype* Clone(){return new ConcretePrototype(*this);}ConcretePrototype(int other):Prototype(other){ conabc=other/2;}ConcretePrototype(const ConcretePrototype& other):Prototype(other){ conabc=other.conabc ;}
};
main()
{//Prototype* prototype=new Prototype(9765);Prototype* prototype=new ConcretePrototype(10);Prototype* p;p=prototype->Clone();//再创建实例的时候不需要new只需要赋值已有实例即可。//p=new Prototype(*prototype);p->func();cout<<p->abc;
}
【设计模式学习笔记1】原型法相关推荐
- 【设计模式学习笔记】原型模式
原型模式,估计这是最简单的模式了.这个模式可以用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.额外说一句,这里的创建对象只是浅拷贝的. 文章目录 ...
- 设计模式学习笔记清单
设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累. ...
- 设计模式学习笔记汇总目录
这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...
- 设计模式学习笔记——原型(Prototype)框架
设计模式学习笔记--原型(Prototype)框架 @(设计模式)[设计模式, 原型模式, prototype] 设计模式学习笔记原型Prototype框架 基本介绍 原型案例 类图 实现代码 Pro ...
- java/android 设计模式学习笔记(1)--- 单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- java/android 设计模式学习笔记(1)---单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- 步步为营 .NET 设计模式学习笔记系列总结
设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...
- 设计模式学习笔记——访问者(Visitor)模式
设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...
- 设计模式学习笔记(目录篇)
设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1 设计模式学习笔记(一:命令模式) 2 设计模式学习笔记(二:观察者模式) 3 设计模式学习笔记(三 ...
- 设计模式学习笔记--访问者(Visitor)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...
最新文章
- csdn修改博客皮肤
- mac mysql编码修改_mac 下修改mysql数据库的编码格式
- Spread for ASP.NET技术白皮书
- asp.net2.0中通过CS代码来动态的指定aspx页面中head中的信息
- Win10 calc.exe 无法打开计算器的解决方法
- Navicate Premium连接Oracle数据库报错
- 给MVC中的V设计一个框架
- vue.js源码学习分享(五)
- 再见 Postman!Apifox 才是 YYDS!
- oracle中导入,ORACLE数据导入
- 敏捷方法开发总结的点评记录
- c语言memset函数作用,详解C语言中的memset()函数
- H5网页漫画小说苹果cms模板源码/支持对接公众号/支持三级分销
- 10分钟看明白大M法和两阶段法
- 离散Hopfield神经网络摘记
- 【导数术】10.导数数列不等式
- 使用 matplotlib处理彩色图像
- 训练人物和摩托车的yolov4-tiny模型教程
- java毕业设计中山乡村文化旅游网络平台Mybatis+系统+数据库+调试部署
- gridview纯图片九宫图展示
热门文章
- 关于nbsp的一点笔记
- hook(2)Activity启动流程,涨知识
- css怎样让字体变细,css怎么把字体变细?
- 远程桌面由于以下原因之一无法连接到远程计算机,富含多种解决方案,全网最详细
- 使用 ipmitool 实现 Linux 系统下对服务器的BMC管理
- 豌豆淘一语道破S2b2c玄关,带你认识S2b2c模式
- 计算机java用什么收题_JAVA是一种______。 A.计算机语言 B.计算机没备 C.数据库 D.应用软件...
- [nrf52][SDK17] 如何修改BLE_MAC地址?
- 软件测试项目交付,成功交付离岸项目的三个步骤
- 台式计算机怎么截屏,台式电脑,怎么截图全屏?