设计模式个人思考

创建型模式

我理解的参与者主要是:用户、工厂、零件生产商。一般的,零件生产商为工厂生产零件,用户调用工厂生成产品

1.抽象工厂与工厂方法的区别

我理解的抽象工厂与工厂方法的区别:
抽象工厂是先有工厂,后有用户,用户选择工厂后再创建对象;而工厂方法是根据用户需求创建对象(感觉工厂方法中工厂即用户)。
关键在于用户在实现(make或create)的时候有没有接收一个工厂实例,若有则是抽象工厂模式。
抽象工厂是由工厂生产零件,工厂模式由用户(因为该模式中工厂即用户)直接管理零件商。

网上解释的抽象工厂与工厂方法的区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

2.Builder(生成器)模式

该模式中用户值只需给出如何创建,而不用知道对象具体是如何被创建的,如盖房子时用户提出在东面开一个门,而不需指出如何开门(貌似没说清楚。。。);
对象在创建过程中,一直在工厂(接口的实现类)里加工,当对象在工厂中被创建后,用户获取返回值来获取该对象。而抽象工厂和工厂方法中在用户类维护该对象。

3.Prototype(原型)模式

比较显著的特点是需要重定义Clone并实现相应的拷贝构造器。其缺点是若对象结构包含循环引用时,构造Clone较困难。
在创建工厂时由需求(传入的参数)设置零件厂商,创建完毕后,用户调用时返回产品。

该模式与抽象工厂相同之处在于:
用户都需要通过工厂来生产产品。
该模式与抽象工厂不同之处在于:
该模式在创建工厂时传入零件厂商实例,抽象工厂中用户生产产品时需传入工厂实例;
该模式在创建工厂时,动态设置零件厂商;即该模式不需要拥有那么多工厂,而只需拥有与抽象工厂相同的零件厂商就行,从而减少工厂类的数量。个人感觉比抽象工厂更灵活。

4.Singleton(单件)模式

一个类只能创建该类或其子类的一个实例,并提供全局访问点。

总结:
工厂方法是一种标准的创建对象的方法,但若被实例化的类根本不发生变化或当实例化出现在子类可以很容易重定义的操作中,这就并不重要了。
使用抽象工厂、原型或生成器的设计往往比工厂方法更灵活,但它们也更加复杂。

结构型模式

 1.适配器模式

适 配器模式分为类适配器和对象适配器。书上的结构图中,构造一个适配器与两个类产生关系。构造一个适配器首先要继承一个接口类,接下来,若:私有继承 (c++中允许多继承)第二个类,则该继承属于类适配器;若适配器只是维护一个指向第二个类的指针,则属于对象适配器。但是jdk中的adapter均不 是如此,以KeyAdapter为例。KeyAdapter实现两个接口:KeyListener和EventListener,而 KeyListener又继承EventListener,准确地说KeyAdapter只继承了KeyListener,且KeyAdapter中的方 法都是空方法。
书上还提到一个双向适配器(p94)。

2.桥接模式

 桥接的意图是将抽象部分与实现部分分离。
抽象部分可以实现一些总体的逻辑,实现部分则实现最基本、最原子的操作。

java例子可参考http://www.blogjava.net/qinysong/articles/63024.html。

3.组合模式

较容易理解。适于有明显的类层次结构。工作重点在于对叶节点和中间节点中方法的管理。

4.装饰模式

使用于给某个对象添加一些功能(而不是整个类),这比直接生成子类要灵活。

5.外观模式(未理解)

往往与其它模式结合。其主要任务是简化接口

6.享元(flyweight)模式

对那些通常因为数量太大而难以用对象来表示的概念或实体进行建模

原文地址:https://www.cnblogs.com/winstonet/p/6916231.html