23种设计模式总结
http://cj723.cnblogs.com
1:简单工厂模式 20210805
- 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
- 简单工厂模式是属于创建型设计模式,关注于对象的创建。
- 现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。
-
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。
即使用者可直接消费产品而不需要知道其生产的细节
Input:你指定代表实例的变数,工厂就会返回相应的类的对象实例。
例子:支付方式 https://www.cnblogs.com/hzhhhbb/p/11406771.html
2:策略模式 20210806
--在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
--在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
--策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
--策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
https://www.runoob.com/design-pattern/strategy-pattern.html
3:单一职责原则 20210810
就一个类而言,有且仅有一个引起它变化的原因。如果一个类承载的职责的过多,就等于把这些职责耦合在一起。一个职责的变化的时候,可能会抑制或者削弱其他职责的能力,这种耦合会导致脆弱的设计。
当变化发生时候,设计会遭受到意想不到的变化。例子:俄罗斯方块游戏
4:开放-封闭原则 20210810
对扩展开放,对于更改是封闭的。即面对需求,程序是通过增加新代码来实现的,而不是通过更改来实现的。
在我们最初写代码的时候,我们是假设不会变化的,当变化发生的时候,我们就创建抽象来隔离以后发生的同类变化。
开放-封闭原则是整个面像对象设计的核心所在,遵循此原则会使我们的代码可维护,可复用,可扩展,灵活性好。
开发人员仅对程序中呈现频繁变化的那些部分做出抽象。
5:依赖倒转原则 20210810
A:高层模块不应该依赖底层模块,两者都应该依赖抽象。
B:抽象不应该依赖细节,细节应该依赖抽象。
针对接口编程,不要对实现编程。
里氏代换原则:子类型必须能够替换掉他们的父类型。(一个软件实体如果使用的是他们父类,那么一定适用于其子类,并且察觉不出父类对象和子类对象的区别。也就是说,在程序里面,把父类替换成子类,程序的行为没有区别。)
依赖倒转原则可以说是面向对象编程的标志。用哪种语言来编写程序不重要。
如果编写时考虑的都是如何面向抽象编程,而不是面向细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口类,这样的设计就称为面向对象编程,否则就是过程式的编程。
6: 装饰模式 20210812 人和穿衣服
有效的把类的核心职责与装饰功能区分开了。为已有功能动态的添加更多功能的一种方式。
装饰模式提供了这样一种方式,把非核心代码,装饰功能放在单独的类中,并让这个类包装它需要装饰的对象。当需要执行特殊行为的时候,客户代码就可以在运行时候按需要有选择的,按顺序地使用装饰功能包装对象。
就增加功能来说,装饰模式比增加子类更加灵活。
7:代理模式 20210816 追求模式
为其他对象提供一种代理以控制对这个对象的访问。
代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。代理就是真实对象的代表。
第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
第二:虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
第三:安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
第四:智能代理。是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时候,可以自动释放它。或当第一次引用一个持久化对象时候,将它装入内存。
8: 工厂方法模式 20210817 学雷锋
工厂方法模式就是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。也就是说,工厂方法把简单工厂的内部逻辑判断转移到了客户端。你想要加功能,本来是改工厂类的,现在是修改客户端代码。
9: 原型模式 20210819 写简历
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
.NET在System命名空间中提供了ICloneable接口,其中就有唯一的一个方法Clone(),只需要实现这个接口就可以完成原型模式了!
浅复制:复制当前对象的浅表副本。方法是创建一个新对象,然后将该对象的非静态字段复制到该对象。如果对象是值类型的,则对该字段执行逐位复制。如果字段是引用类型的,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一对象。
:浅复制的例子 (MemberwiseClone())
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
例子:数据集对象Dataset,Clone():浅复制,Copy():深复制。
10:模板方法模式 20210823 试卷例子
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现有可能不同的时候,通常考虑用该模式来处理。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特殊步骤。
特点:通过把不变行为搬移到超类,去除子类中的重复代码来体现优势。
11 : 迪米特法则 20210824 无熟人难办事
最小知识法则。如果两个类不需要直接通信,那么这两个类就不必要发生直接的作用。如果一个类需要调用另一个类的方法的话,可以通过第三者转发这个调用。在类的结构设计上,每一个类都应该尽量降低成员的访问权限。
强调了类之前的松藕合。类之间的藕合越松,越有利于复用。一个处在弱耦合的类被修改,不会对有关系的类造成波及。
12 :外观模式 20210824 牛市股票还会亏钱?
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高度的接口。这个接口使得子系统更加容易使用。
何时使用外观模式:① 数据访问,业务逻辑,表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。