关于.NET 设计模式 思维导图

Donkey'sNodes

导航

.NET 设计模式 思维导图

	<link rel="stylesheet" type="text/css" href="https://files.cnblogs.com/files/anylian/cnblog-informal-essay-v5.css" />
	<div class="burro">
		<ul><h1>背景说明</h1>
			<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以前都在匆匆忙忙写代码,在无穷无尽的需求中间左冲右突,最近终于有一些闲暇的时间,来总结和思考编程中的一些核心思想,磨刀不误砍柴的功夫,期望通过总结和学习,能够在编程设计上能够有更进一步的提升。</p>
		</ul>
		<ul class="number-list">
			<h1>回看设计模式</h1>
			<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些设计模式,都来源于生活,都是将生活中一些实际场景,应用在编程当中,以解决编程当中遇到的不同问题,使得思路更容易理解、更方便阅读。如果我们是一个对编程有想法、遇到过实际难题的人,我们或许也能设计出属于自己的“设计模式”!</p>
			<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还是先发个照,纪念一下归纳出23种设计模式的四位前辈。在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。
				<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;▣ 对接口编程而不是对实现编程。</span>
				<br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;▣ 优先使用对象组合而不是继承。</span>
			</p>
			<img src="http://c.biancheng.net/uploads/allimg/181112/1-1Q1121P24VM.jpg" width="500" height="100%" style="margin-left:42px">
			<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是25种设计模式的特征、类型、应用场景等,之所以列出英文,因很多情况下,看到英文,就能联想到自己见过的一些类:
			</p>
			<li>
				设计模式的分类
				<dl>1.1.创建型设计模式
					<p class="foldable">1.1.1.单例模式(Singleton Pattern)
						<br /><span class="tab-space-0">特征:</span>
						<br /><span class="tab-space-1">全局只有一个实例</span>
						<br /><span class="tab-space-1">必须自己创建自己的唯一实例</span>
						<br /><span class="tab-space-0">类型:</span>
						<br /><span class="tab-space-1">懒汉式</span>
						<br /><span class="tab-space-1">饿汉式</span>
						<br /><span class="tab-space-1">双检锁</span>
						<br /><span class="tab-space-1">登记式</span>
					</p>
					<p class="foldable">1.1.2.工厂模式(Factory Pattern)
						<span class="tab-space-0">类型:</span>
						<br /><span class="tab-space-1">简单工厂模式</span>
						<br /><img class="tab-image-2" src="https://img2020.cnblogs.com/blog/1274954/202008/1274954-20200822194211182-1545176659.png" >
						<br /><span class="tab-space-1">工厂方法模式</span>
						<br /><img class="tab-image-2" src="https://img2020.cnblogs.com/blog/1274954/202008/1274954-20200822194337225-1107800118.png" >
						<br /><span class="tab-space-1">抽象工厂模式</span>
						<br /><img class="tab-image-2" src="https://img2020.cnblogs.com/blog/1274954/202008/1274954-20200822194420989-380999166.png" >
						<br />
						<br /><span class="tab-space-0">场景:</span>
						<br /><span class="tab-space-1">创建相似对象</span>
						<br />
						<span class="tab-space-0">角色</span>
						<br /><span class="tab-space-1">AbstractFactory:抽象工厂角色</span>
						<br /><span class="tab-space-1">ConcreteFactory:具体工厂角色</span>
						<br /><span class="tab-space-1">AbstractProduce:抽象产品角色</span>
						<br /><span class="tab-space-1">ConcreteProduce:具体产品角色</span>
						<br />
						<span class="tab-space-0">区别:用生产鼠标作例子,试图理解其区别</span>
						<br /><span class="tab-space-1"><b>简单工厂模式</b></span>
						<br /><span class="tab-space-2">产品清单:本厂专业生产罗技品牌的有线鼠标、机械鼠标,欢迎随时预定</span>
						<br /><span class="tab-space-2">客户需求:</span>
						<br /><span class="tab-space-3">客户:我要罗技机械鼠标</span>
						<br /><span class="tab-space-3">工厂:好的,我有现成的</span>
						<br /><span class="tab-space-3" style="color:darkgray">三个月后...</span>
						<br /><span class="tab-space-3">客户:我要罗技无线鼠标</span>
						<br /><span class="tab-space-3">工厂:也可以,我先改造我的生产技术和设备先....</span>
						<br /><span class="tab-space-3" style="color:darkgray">设备升级中...</span>
						<br /><span class="tab-space-3">工厂:好了,现在我能生产罗技品牌的有线鼠标、机械鼠标、无线鼠标,有需要随时找我</span>
						<br /><span class="tab-space-3">客户:不好意思,我想再要一批罗技智能鼠标</span>
						<br /><span class="tab-space-3">工厂:<b>......</b></span>
						<br /><span class="tab-space-1"><b>工厂方法模式</b></span>
						<br /><span class="tab-space-2">产品清单:我们提供罗技鼠标和双飞燕鼠标的专业生产能力,下属两个大厂,一个厂专门生产罗技鼠标,一个厂专门生产双飞燕鼠标</span>
						<br /><span class="tab-space-2">客户需求:</span>
						<br /><span class="tab-space-3">客户:我要罗技鼠标</span>
						<br /><span class="tab-space-3">我:好的,我让罗技工厂做好后发货给你</span>
						<br /><span class="tab-space-3">客户:我要双飞燕鼠标</span>
						<br /><span class="tab-space-3">我:好的,我让双飞燕工厂马上进行生产</span>
						<br /><span class="tab-space-3">客户:我要雷蛇鼠标</span>
						<br /><span class="tab-space-3">我:......好的,我先去贷款建个厂先...</span>
						<br /><span class="tab-space-1"><b>抽象工厂模式</b></span>
						<br /><span class="tab-space-2">产品清单:我厂提供双飞燕鼠标、键盘等双飞燕旗下产品的委托生产制造</span>
						<br /><span class="tab-space-2">客户需求:</span>
						<br /><span class="tab-space-3">客户:我要双飞燕鼠标</span>
						<br /><span class="tab-space-3">工厂:好的,我联系双飞燕工厂,做完后发货过来</span>
						<br /><span class="tab-space-3">客户:我要双飞燕键盘</span>
						<br /><span class="tab-space-3">工厂:好的,我联系双飞燕工厂,做完后发货过来</span>
						<br /><span class="tab-space-3">客户:我要罗技音响</span>
						<br /><span class="tab-space-3">工厂:不好意思,我们暂时和罗技厂商那边还没有取得合作关系,不过我有双飞燕生产的音响,您需要吗?</span>
						<br /><span class="tab-space-3">客户:不,我就要罗技音响....</span>
						<br /><span class="tab-space-3">工厂:额...我们后期也会考虑和罗技进行合作的</span>
						<br /><span class="tab-space-3">客户:你们没有办法自己生产罗技音响吗?</span>
						<br /><span class="tab-space-3">工厂:抱歉,我们只是抽象工厂,没有实际的产能,只能联系实体工厂那边进行生产的</span>
					</p>
					<p class="foldable">1.1.3.建造者模式(Builder Pattern)
						<br /><span class="tab-space-0">类图:</span>
						<br /><img src="https://img2020.cnblogs.com/blog/1274954/202008/1274954-20200822194557999-792298304.png" >
						<br /><span class="tab-space-0">场景:创建复杂对象</span>
						<br /><span class="tab-space-0">角色:</span>
						<br /><span class="tab-space-1">Director:指挥者</span>
						<br /><span class="tab-space-1">Client:客户端</span>
						<br /><span class="tab-space-1">ConcreteBuilder:建造者</span>
						<br /><span class="tab-space-1">Product:产品</span>
						<br /><span class="tab-space-0">实例:</span>
						<br /><span class="tab-space-1">比如StringBuilder,参考<a href="https://blog.csdn.net/qq2071114140/article/details/104216547">StringBuilder与建造者模式</a></span>
						<br /><span class="tab-space-1">有一些编译器,也以Builder来命名,比如C++ Builder、PowerBuilder,由程序员指挥编译器,经过复杂的过程,生成编译文件。</span>
					</p>
					<p class="foldable">1.1.4.原型模式(Prototype Pattern)
						<br /><span class="tab-space-0">类图:</span>
						<br /><img src="https://img2020.cnblogs.com/blog/1274954/202008/1274954-20200822194624426-1057371651.png" >
						<br /><span class="tab-space-0">场景:</span>
						<br /><span class="tab-space-1">创建重复的对象,同时又能保证性能(安全执行 + 深度复制 + 快速反馈)</span>
						<br /><span class="tab-space-1">当直接创建对象的代价比较大时,则采用这种模式</span>
						<br /><span class="tab-space-0">角色:</span>
						<br /><span class="tab-space-1">客户(Client):客户类提出创建对象的请求。</span>
						<br /><span class="tab-space-1">抽象原型(Prototype):规定拷贝接口。</span>
						<br /><span class="tab-space-1">具体原型(Concrete Prototype):被拷贝的对象。</span>
					</p>
				</dl>
				<dl>1.2.结构型
					<p class="foldable">1.2.1.适配器模式(Adapter Pattern)
						<br /><span class="tab-space-0">场景:</span>
						<br /><span class="tab-space-0">实例:</span>
					</p>
					<p class="foldable">1.2.2.装饰器模式(Decorator Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.2.3.代理模式(Proxy Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.2.4.外观模式(Facade Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.2.5.桥接模式(Bridge Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.2.6.组合模式(Composite Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.2.7.享元模式(Flyweight Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.2.8.过滤器模式(Filter Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
				</dl>
				<dl>1.3.行为型
					<p class="foldable">1.3.1.策略模式(Strategy Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.2.模板模式(Template Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.3.观察者模式(Observer Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.4.迭代器模式(Iterator Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.5.责任链模式(Chain of Responsibility Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.6.命令模式(Command Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.7.备忘录模式(Memento Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.8.状态模式(State Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.9.访问者模式(Visitor Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.10.中介者模式(Mediator Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.11.解释器模式(Interpreter Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
					<p class="foldable">1.3.12.空对象模式(Null Object Pattern)
						<br /><span class="tab-space-0">应用场景:</span>
						<br /><span class="tab-space-0">应用实例:</span>
					</p>
				</dl>
			</li>
			<li>
				思维导图
				<img src="https://img2020.cnblogs.com/blog/1274954/202008/1274954-20200822194755136-143965284.png" />
			</li>
		</ul>
		<ul><h1>后记</h1>
			<li>
				源码下载及图片出处说明
				<p>
					Github .NET 源码例子,会持续进行更新
					<br /><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://github.com/xiangaylian/augusthigos">点此跳转到Github</a></p>
				</p>
				<p>
					类图摘自于简书作者<a href="https://www.jianshu.com/u/2baf4dc0fbe6">Whyn</a>的系列文章中。
				</p>
				<p>思维导图是我自己所画,转载请注明出处。</p>
			</li>
			<li>
				作者声明
				<p>
					文章主要是我自己学习设计模式的总结,也期望给正在学习的伙伴带来帮助,不足之处,感谢留言指正。
					<br />
					文章与源码例子会持续于本文中和Github仓库进行更新,仅此一篇,不会另写系列文章。
				</p>
			</li>
		</ul>
	</div>
            <div>
                  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
                  <script src="https://files.cnblogs.com/files/anylian/cnblog-informal-essay-v1.js" ></script>
            </div>

posted on 2020-08-22 20:05  中年油腻驴  阅读(1700)  评论(1编辑  收藏  举报