优点:
1、 封装性,每个产品的实现类不是高层模块关心的,它只关心接口、抽象表示,它不关心对象是如何被创建出来的,对象的创建是由工厂类负责的,因此只要知道该产品的工厂类是谁,就能够创建出一个需要的对象,省时省力;
2、 产品族内的约束为非公开状态。产品族内的约束条件对调用工厂类的高层模块来说是透明的,它不需要知道其中的约束,它只关心具体的产品就可以,产品族内的约束实在工厂内实现的。
缺点:
抽象工厂最大的缺点就是产品族扩展非常困难。以上述类图为例,如果要增加一个产品C,即产品族由原来的2个增加到3个,这时我们就要将抽象类AbstractCreator增加一个方法createProductC(),然后两个实现类都要修改,这就违反了开闭原则,而且抽象类和接口是一个契约,改变契约,所有与契约相关的代码都要修改,那么这段代码就成了有毒代码,会对整个程序带来危害。
实现要点:
在抽象工厂模式中,选用哪种产品族的问题,需要采用工厂方法或简单工厂模式来配合解决。
抽象工厂模式和工厂方法模式一样,都把对象的创建延迟到了他的子类中。
…… …… 余下全文
七大设计原则:
单一职责原则(SRP):对于一个类,应该只有一个导致其变化的原因。
涉及模式:门面、Proxy
开闭原则(OCP):设计一个模块时,应该使该模块在不被修改的前提下被扩展,即可在不必修改源代码的情况下改变该模块的行为。对扩展开放,对更改封闭。抽象化是关键。 涉及模式:Strategy, Simple Factory, Factory Method, Abstract Factory, Builder, Bridge, 门面,Mediator.
里氏替换原则(LSP):一个软件实体如果使用的是一个基类的话,一定适用于其子类,而且根本不能觉察出基类对象和子类对象的区别。(在软件中如果能够使用基类对象,那么一定能够使用其子类对象)
尽量从抽象类继承而不从具体类继承;如果两个具体类A和B有继承关系,那么最简单的是建立一个抽象类C,让A和B成为C的子类;如果有一个由继承关系形成的等级结构,则所有树叶节点应该是具体类而所有树枝节点应该是抽象类或接口。
涉及模式:Strategy, Composite, Proxy
依赖倒置原则(DIP):高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。针对接口编程,不要针对实现编程。
…… …… 余下全文
桥接模式——Bridge
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何 意义。实现指的是抽象类和它的派生类用来实现自己的对象。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们独自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。
桥接模式的结构图如下:
将抽象部分与它的实现部分分离,这不是很好理解,我的理解就是实现系统可能有很多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。也就是说,在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放—封闭原则时,就应该要考虑桥接模式。
单例模式——Singleton
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。
单例模式的结构图如下:
…… …… 余下全文
注:
文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。
要点:
1. 用于处理树形结构的问题中,它模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素内部结构解耦。
2. 组合模式可以优化处理递归或者分级数据结构。
我们可以将组合理解为两个层面的意思,一个是按“整体-部分”的方式一个将复杂过程组成树型结构,另一个层面则是强调整个树的执行要有统一的接口,可以被递归的调用。
3. 应用场景: OS文件系统,JUnit
1.(Composite Pattern)组合模式
详解1: 组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。
…… …… 余下全文
C#大话设计模式学习总结
一、工厂模式
面向对象的三个特性:封装,继承和多态
1.封装
Class Operate
{
private double _numberA;
private double _numberB;
public double NumberA
{
get{return _numberA;}
set{_numberA = value;}
}
public double _numberB
{
get{return _numberB;}
set{_numberB = value;}
}
…… …… 余下全文
注:
文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。
Singleton模式(单例模式)
要点:
1. 实质和特点
2. 实现手法:JAVA、C++不一样,实现时应该注意那些细节。
3. 生命周期的控制:Dead Reference的解决
4. 多线程问题:C++:双检锁、Volatile,
JAVA:JAVA中有 lazy initialization hoder 来实现
应用场景:
数据库连接
打印机(可以有几个打印任务,但只能有一个打印机)
序列号生成(多个的话可能会导制重复)
数据库表中记录ID的生成(非单例的话可能会重复)
单例模式的特点:
? 单例类只能有一个实例。
? 单例类必须自己创建自己的唯一实例。
? 单例类必须给所有其它对象提供这一实例。
即:
? 一个私有构造函数——确保用户无法通过new直接实例它;
? 一个静态私有成员变量instance;
? 一个静态公有方法Instance()——方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。并且这也是一个全局访问点。 例如:
…… …… 余下全文
创建型模式分为六种:
1、 单例模式:在系统中只能形成类的一个对象。
2、 工厂方法模式:按类型创建出一个笼统的对象。
3、 抽象工厂模式:按多级类型创建笼统的对象。
4、 模板模式:在抽象类中实现一部分代码,通过继承方式使子类共享,避免代码复制。
5、 建造模式:按顺序一步步创建出复杂对象。
6、 原型模式:利用克隆方法,快速创建出一模一样的对象。
以下为了节省篇幅,忽略了一些程序细节和严谨性,包括:
?
?
? 忽略了部分getter和setter方法。 忽略了必须的try…catch 忽略了一些原本应该从接口实现或从抽象类集成的代码
确保在整个系统中仅有该类的一个对象,该对象对于整个系统来说时全局的。
//单例类
public class Singleton
{
//在类中自己初始化一个static且final的自己对象。
private static final Singleton singleton = new Singleton();
//将类的构造函数定义为私有的,以避免被其他类new出来一个对象。
private Singleton() { }
…… …… 余下全文
1. 工厂模式和抽象工厂模式
相同点:在两种工厂模式在被使用的时候都能产生具体的产品类,比直接创建对象更加灵活! 不同点:工厂模式只有一个抽象产品类,而抽象工厂模式可以有多个!工厂模式的具体工厂类只能创建一个具体类的实例,而抽象工厂模式则可以创建多个!
2.抽象工厂模式和建造者模式
相同点:都能生产出具体的产品类
不同点:抽象工厂模式是定义一个创建对象的接口,让子类决定实现哪一个类,抽象工厂使其子类延迟到其子类,其本身是没有状态的。建造者模式是将一个复杂对象的创建与他的表示分离,使同样的构造过程可以创建不同的表示,其是有状态的,比抽象工厂更加灵活(比较之下,抽象工厂处于更加具体的尺度上,而建造者模式处于更加宏观的尺度上)!
3.类适配器和对象适配器
对象适配器:不是通过继承的方式,而是通过对象组合的方式来进行处理的,我们只要学过OO的设计原则的都知道,组合相比继承是推荐的方式。
类适配器:通过继承的方式来实现,将旧系统的方法进行封装。对象适配器在进行适配器之间的转换过程中,无疑类适配器也能完成,但是依赖性会加大,并且随着适配要求的灵活性,可能通过继承膨胀的难以控制。
【一般来说类适配器的灵活性较差,对象适配器较灵活,是我们推荐的方式,可以通过依赖注入的方式,或者是配置的方式来做。类适配器需要继承自要适配的旧系统的类,无疑这不是一个好的办法。】
…… …… 余下全文