纵横谈23种面向对象的设计模式--创建型
面向对象23种设计模式

面向对象23种设计模式面向对象23种设计模式在面向对象的编程中,设计模式是一种解决问题的通用方案。
设计模式可以帮助开发人员在开发过程中减少代码的冗余和复杂性,并提高代码的可维护性和可重用性。
本文将介绍23种面向对象的设计模式。
1. 工厂方法模式工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类决定实例化哪个类。
在工厂方法模式中,客户端不需要知道具体的创建逻辑,只需要知道工厂类中定义的接口即可。
2. 抽象工厂模式抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定它们的具体类。
在抽象工厂模式中,客户端不需要知道具体的创建逻辑,只需要知道工厂类中定义的接口即可。
3. 单例模式单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个访问该实例的全局点。
4. 原型模式原型模式是一种创建型设计模式,它允许复制或克隆一个现有的对象,而不必知道其具体实现。
5. 建造者模式建造者模式是一种创建型设计模式,它允许逐步创建复杂的对象,而不必知道其内部实现细节。
6. 适配器模式适配器模式是一种结构型设计模式,它将一个或多个不兼容的类或接口转换为客户端所需的接口。
7. 桥接模式桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离开来,以便独立地进行修改。
8. 组合模式组合模式是一种结构型设计模式,它将一组对象作为单个对象处理,以便客户端可以以相同的方式处理单个对象和组合对象。
9. 装饰器模式装饰器模式是一种结构型设计模式,它允许向现有对象添加额外的功能,同时不改变其现有的结构。
10. 外观模式外观模式是一种结构型设计模式,它为一组复杂的子系统提供了一个统一的接口,以便于客户端使用。
11. 享元模式享元模式是一种结构型设计模式,它利用共享技术来最小化内存使用,以及提高应用程序的性能。
12. 代理模式代理模式是一种结构型设计模式,它提供了一个代理对象,使得客户端可以通过代理对象间接地访问实际对象。
关于23种设计模式新解

关于23种设计模式新解创建型模式1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。
麦当劳和肯德基就是生产鸡翅的Factory工厂模式:客户类和工厂类分开。
消费者任何时候需要某种产品,只需向工厂请求即可。
消费者无须修改就可以接纳新产品。
缺点是当产品修改时,工厂类也要做相应的修改。
如:如何创建及如何向客户端提供。
2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你” builder。
(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。
建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。
(100块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。
23种设计模式额形象比喻 (1)

1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM 爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。
麦当劳和肯德基就是生产鸡翅的Factory。
工厂模式:客户类和工厂类分开。
消费者任何时候需要某种产品,只需向工厂请求即可。
消费者无须修改就可以接纳新产品。
缺点是当产品修改时,工厂类也要做相应的修改。
如:如何创建及如何向客户端提供。
2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。
(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。
建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM 到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。
(100块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。
23种设计模式记忆 口诀

23种设计模式记忆口诀1.单例模式:独一无二,最重要。
2.工厂模式:制造者,无需说。
3.抽象工厂:一族产品,同根源。
4.建造者模式:一步一步,建造家。
5.原型模式:克隆专家,快捷法。
6.适配器模式:转换者,聪明智。
7.桥接模式:结构优化,灵活性。
8.装饰模式:装饰者,美化家。
9.组合模式:树形结构,组合家。
10.外观模式:微缩封装,简洁家。
11.享元模式:享元工厂,节省家。
12.代理模式:替身幕后,保护家。
13.模板方法:算法继承,不变家。
14.策略模式:行为封装,灵活家。
15.命令模式:命令者,有权家。
16.职责链模式:可扩展,级别性。
17.状态模式:状态管理,干净家。
18.观察者模式:被观察,自主家。
19.中介者模式:中介者,沟通家。
20.迭代器模式:循环选择,简化家。
21.访问者模式:动态添加,扩展家。
22.备忘录模式:状态备份,还原家。
23.解释器模式:解释语言,特殊家。
以上23种设计模式,为了更好地记忆,我把它们组合成了一个口诀:最重要的单例模式,工厂与抽象同皇冠。
建造渐进如养家,克隆是原型美化家。
适配器桥接转化家,组合成树形结构家。
装饰装扮美化家,微缩封装外观家。
享元共用节省家,代理替身保护家。
策略模式灵活家,命令者有权家。
职责链扩展级别性,状态干净管理家。
被观察自主家,中介者沟通家。
循环迭代简化家,访问者动态扩展家。
备忘录变化还原家,解释语言特殊家。
这个口诀是通过把每个模式的主要特点和功能用简洁的语句表达出来,然后通过排列组合的方式形成的。
相信这个口诀会让你更容易地记忆这23种设计模式,并且可以在以后的工作中灵活地运用它们。
面向对象开发中的七大设计原则和23种设计模式

⾯向对象开发中的七⼤设计原则和23种设计模式⼀、⾯向对象开发中的七⼤设计原则 软件开发中最核⼼的思想就是“⾼内聚,低耦合”,主要的⽬的也是为了⽅便后期的维护和变更。
下⾯的设计原则也是依靠这个核⼼思想衍⽣出来的。
1、单⼀职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:单⼀职责原则想表达的核⼼思想就是“⾼内聚”,⼀个模块只完成⼀项功能。
在⾯向对象设计中,⼀个类只应该负责⼀项职责,如果同时承担太多职责,就等于把这些职责耦合在了⼀起。
后⾯很可能因为某项职责的变更⽽导致其他职责的削弱或者抑制其他职责的能⼒。
2、⾥⽒替换原则【LISKOV SUBSTITUTION PRINCIPLE】:任何时候都可以⽤⼦类型来替换⽗类型。
3、依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】:⾯向接⼝编程,声明⽅法的参数类型、⽅法的返回类型、变量的引⽤类型时,尽可能使⽤抽象类型⽽不⽤具体类型,因为抽象类型可以被它的任何⼀个⼦类型所替代,请参考下⾯的⾥⽒替换原则。
4、接⼝隔离原则【INTERFACE SEGREGATION PRINCIPLE】:建⽴单⼀接⼝,不要建⽴庞⼤臃肿的接⼝,尽量细化接⼝。
5、迪⽶特法则【LOW OF DEMETER】:迪⽶特法则⼜叫最少知识原则,⼀个对象应当对其他对象有尽可能少的了解。
(低耦合) 6、开闭原则【OPEN CLOSE PRINCIPLE】⼀个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
7、组合/聚合复⽤原则【Composition/Aggregation Reuse Principle(CARP) 】:尽量使⽤组合和聚合,少使⽤继承的关系来达到复⽤的原则。
类与类之间简单的说有三种关系,IS-A关系、HAS-A关系、USE-A关系,分别代表继承、关联和依赖。
其中,关联关系根据其关联的强度⼜可以进⼀步划分为关联、聚合和合成,但说⽩了都是HAS-A关系,合成聚合复⽤原则想表达的是优先考虑HAS-A关系⽽不是IS-A关系复⽤代码⼆、23种设计模式 设计模式是⼀套被反复使⽤的代码设计经验的总结,是对上⾯的设计原则的进⼀步细化,使⽤设计模式是为了可重⽤代码、让代码更容易被他⼈理解、保证代码可靠性。
面向对象设计的23个设计模式详解

面向对象设计的23个设计模式详解面向对象设计是一种广泛应用于软件开发的思想,其核心在于将数据和操作封装在一起形成对象,并通过各种方式进行交互和组合,从而实现复杂的功能。
在这一过程中,设计模式起到了非常重要的作用,可以有效地提高代码的可读性、可维护性和可扩展性。
本文将对23种常见的设计模式进行详解。
一、创建型模式1.简单工厂模式简单工厂模式属于创建型模式,其目的是提供一个工厂类,使得创建对象的过程更加简单。
在这种模式中,使用者只需要提供所需对象的参数,而无需关心对象的具体实现细节。
简单工厂模式适合于对象创建过程较为简单的情况。
2.工厂方法模式工厂方法模式是简单工厂模式的进一步扩展,其核心在于将工厂类进行接口抽象化,使得不同的工厂类可以创建不同的对象实例。
工厂方法模式适合于对象创建过程较为复杂的情况。
它可以为工厂类添加新的产品类型,而不会影响原有的代码。
3.抽象工厂模式抽象工厂模式是工厂方法模式的进一步扩展,其目的是提供一个可以创建一系列相关或者独立的对象的接口。
在抽象工厂模式中,使用者只需要关心所需对象组合的类型,而无需关注对象的具体实现过程。
4.建造者模式建造者模式也是一种创建型模式,其目的在于将复杂对象分解为多个简单的部分,并将其组装起来形成复杂对象实例。
在建造者模式中,使用者只需要关注所需对象以及它们的组合方式,而无需关心对象的具体实现过程。
5.原型模式原型模式是一种基于克隆的创建型模式,其核心在于通过复制现有的对象实例来创建新的对象。
在原型模式中,对象实例的创建过程与对象所包含的状态密切相关。
原型模式适合于创建复杂对象实例,且这些对象实例之间是相对独立的情况。
二、结构型模式6.适配器模式适配器模式是一种结构型模式,其目的在于将一个类的接口转换为另一个类所能使用的接口。
在适配器模式中,使用者可以通过不同的适配器实现对象之间的互相调用。
7.桥接模式桥接模式是一种结构型模式,其目的在于将抽象部分与实现部分相互分离,从而使得两者可以独立变化。
23种设计模式

23种设计模式设计模式主要三类型:创建型、结构型⾏型其创建型:⼀、Singleton单例模式:保证类实例并提供访问全局访问点⼆、Abstract Factory抽象⼯⼚:提供创建系列相关或相互依赖象接⼝须指定具体类三、Factory Method⼯⼚:定义⽤于创建象接⼝让类决定实例化哪类Factory Method使类实例化延迟类四、Builder建造模式:复杂象构建与表⽰相离使同构建程创建同表⽰五、Prototype原型模式:⽤原型实例指定创建象种类并且通拷贝些原型创建新象⾏型:六、Iterator迭代器模式:提供顺序访问聚合象各元素需要暴露该象内部表⽰七、Observer观察者模式:定义象间依赖关系象状态发改变所依赖于象都通知⾃更新⼋、Template Method模板:定义操作算⾻架些步骤延迟类TemplateMethod使类改变算结构即重定义该算某些特定步骤九、Command命令模式:请求封装象使⽤同请求客户进⾏参数化请求排队记录请求志及⽀持撤销操作⼗、State状态模式:允许象其内部状态改变改变⾏象看起似乎改变类⼗⼀、Strategy策略模式:定义系列算封装起并使互相替换本模式使算独⽴于使⽤客户⼗⼆、China of Responsibility职责链模式:使象都机处理请求避免请求送发者接收者间耦合关系⼗三、Mediator介者模式:⽤介象封装些列象交互⼗四、Visitor访问者模式:表⽰作⽤于某象结构各元素操作使改变各元素类前提定义作⽤于元素新操作⼗五、Interpreter解释器模式:给定语⾔定义⽂表⽰并定义解释器解释器使⽤该表⽰解释语⾔句⼗六、Memento备忘录模式:破坏象前提捕获象内部状态并该象外保存状态结构型:⼗七、Composite组合模式:象组合树形结构表⽰部整体关系Composite使⽤户单象组合象使⽤具致性⼗⼋、Facade外观模式:系统组接⼝提供致界⾯fa?ade提供⾼层接⼝接⼝使系统更容易使⽤⼗九、Proxy代理模式:其象提供种代理控制象访问⼆⼗、Adapter,适配器模式:类接⼝转换客户希望另外接⼝Adapter模式使原本由于接⼝兼容能起⼯作些类起⼯作⼆⼗⼀、Decrator装饰模式:态给象增加些额外职责增加功能说Decorator模式相⽐类更加灵⼆⼗⼆、Bridge桥模式:抽象部与实现部相离使独⽴变化⼆⼗三、Flyweight享元模式。
23种设计模式记忆口诀

23种设计模式记忆口诀
1.单例模式:唯一实例化,静态访问,线程不安全
2. 工厂方法模式:子类实现,工厂创建,扩展性强
3. 抽象工厂模式:创建一族产品,接口约束,扩展性强
4. 建造者模式:组合复杂对象,分步骤构建,灵活性高
5. 原型模式:克隆对象,避免重复创建,效率高
6. 适配器模式:兼容接口不同,类似转换器,易扩展
7. 桥接模式:抽象与实现分离,解耦合,易扩展
8. 装饰器模式:动态增强对象功能,不影响原有对象,易扩展
9. 组合模式:层次结构,统一访问,易扩展
10. 外观模式:简化复杂系统调用,易使用,易扩展
11. 享元模式:共享资源,避免重复创建,效率高
12. 代理模式:增强对象功能,控制对象访问,易扩展
13. 责任链模式:多个对象处理请求,自动传递,易扩展
14. 命令模式:将请求封装成对象,易扩展,易记录日志
15. 解释器模式:解释语言,易扩展,易维护
16. 迭代器模式:遍历集合,统一访问,易扩展
17. 中介者模式:分离对象间交互,降低耦合,易扩展
18. 观察者模式:对象状态改变,通知观察者,易扩展
19. 备忘录模式:保存对象状态,易恢复,易扩展
20. 状态模式:对象状态改变,自动改变行为,易扩展
21. 策略模式:选择不同策略,易切换,易扩展
22. 模板方法模式:定义操作流程,易扩展,易维护
23. 访问者模式:统一访问集合中对象,易扩展,易维护。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工厂方法模式:提供一个简单的决策类,根据条件生成产品。
抽象工厂模式:提供一个创建并返回一系列产品的接口。
单件模式:某个类只能有一个实例。
提供一个全局访问点。
(可拓展到有限个实例)生成器模式:将一个复杂对象的构建于呈现分开,以便根据不同需要创建不同的形式。
原型模式:先实例化一个类,然后克隆或者拷贝该类来构建新的实例。
可以用共有方法进一步修改这些实例。
难点:生成器模式关注于将构造对象的过程和构造的各个部分分开,而抽象工厂关注于构建一个产品系列。
实际上,最大的区别是生成器模式创建的产品不一定有共同的父类,只要有类似的构造过程即可。
实际上我们常见到的文件资源管理器的实现完全可以使用生成器模式。
简单工厂、工厂模式与生成器模式对比:工厂模式变化点在于新增对象(客户在需要创建新对象的时候,只需要新建一个工厂去继承工厂父类就可以了),而生成器模式在于构建复杂对象的表示(客户在需要创建这个复杂对象的时候,只需要给指导者一个具体的创建者就可以了),变化点完全不同,那么其应用场景自然不同。
如果非要霸王硬上弓的用,那么就需要改动模式构建,例如,生成器模式若要完成新增对象的功能,那么它就可能产生两个不同的builder基类。
这是完全不推荐的。
那简单工厂属于静态工厂,根据传入参数决定需要创建哪种对象,它的扩展性也不好。
Prototype模式同工厂模式,同样对客户隐藏了对象的创建工作,但是,与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的,达到了"隔离类对象的使用者和具体类型(易变类)之间的耦合关系"的目的。
此外引入Prototype模式后不再需要一个与具体产品等级结构平行的工厂方法类,减少了类的构造。
总之,根据不同的应用场景(即不同的变化),选择合适的模式才是王道。
什么叫合适,即变化都可以像配件那样直接装配到系统中,无须改动系统其它部分,系统会自动检测到新增配件,并通过客户程序或者配置文件进行选择。
简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
它又称为静态工厂方法模式,属于类的创建型模式。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
意图:提供一个类,由它负责根据一定的条件创建某一具体类的实例角色及其职责:•工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
工厂类可以被外界直接调用,创建所需的产品对象。
•抽象(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
•具体产品(Concrete Product)角色:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。
模式的特点:•优点:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
在这个模式中,工厂类是整个模式的关键所在。
它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。
有利于整个软件体系结构的优化。
•缺点:体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以"高内聚"方面做的并不好。
另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。
工厂方法模式:工厂方法模式的对简单工厂模式进行了抽象。
有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作推延到其子类去完成。
意图:定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。
优点:实现了开闭原则,可以在不改变工厂的前提下增加新产品。
实现要点:•Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。
•工厂方法是可以带参数的。
•工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。
效果:•用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。
•Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
适用性:•当一个类不知道它所必须创建的对象的类的时候。
•当一个类希望由它的子类来指定它所创建的对象的时候。
•当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
附注:•基类是一个抽象类,模式必须返回一个完整的可工作的类•基类包含默认方法,除非这些默认方法不能胜任才调用子类方法•可以讲参数传递给工厂,告诉工厂返回哪一个类。
抽象工厂模式:提供创建对象的接口。
与工厂方法类似,但此处返回的一系列相关产品。
实现过程同样推延到子系列类去实现。
与工厂方法的区别在于他们的层次模型。
工厂方法的抽象基类只有儿子,而抽象工厂模式却是有孙子,而且每个儿子的儿子们之间有相互关联依赖关系。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
角色及职责:•抽象工厂(Abstract Factory):声明生成一系列抽象产品的方法•具体工厂(Concrete Factory):执行生成一系列抽象产品的方法,生成一系列具体的产品•抽象产品(Abstract Product):为这一系列的某一种产品声明接口•具体产品(Product):定义具体工厂生成的具体产品的对象,实现产品接口•客户(Client):我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。
附注:简单工厂、工厂方法、抽象工厂比较简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。
其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
•简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
•工厂方法:工厂方法是针对每一种产品提供一个工厂类。
通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
•抽象工厂:抽象工厂是应对产品族概念的。
比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结:•工厂模式中,重要的是工厂类,而不是产品类。
产品类可以是多种形式,多层继承或者是单个类都是可以的。
但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别:•简单工厂:用来生产同一等级结构中的任意产品。
(对于增加新的产品,无能为力)•工厂模式:用来生产同一等级结构中的固定产品。
(支持增加任意产品)•抽象工厂:用来生产不同产品族的全部产品。
(对于增加新的产品,无能为力;支持增加产品族)以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。
所以要根据情况考虑应该使用哪种方法。
单件模式:保证某个类有且仅有一个实例。
意图:单件模式保证应用只有一个全局惟一的实例,并且提供一个访问它的全局访问点。
结构:包括防止其他对象创建实例的私有构造函数、保存惟一实例的私有变量和全局访问接口等。
效果:单件提供了全局惟一的访问入口,因此易于控制可能发生的冲突。
单件是对类静态函数的一种改进,首先它避免了全局变量对系统的污染;其次正常类可以有子类,可以定义虚函数,具有多态性。
而类中的静态方法是不能定义为虚函数的,因此不具有多态性。
单件模式可以扩展为多件,即允许有受控的多个实例存在。
适用场合:当类只能有一个实例存在,并且可以在全局访问时。
这个惟一的实例应该可以通过子类实现扩展,并且用户无须更改代码即可使用。
我们前面介绍的工厂类经常被实例化为全局惟一的单件,可能的单件还有管理日志的对象、关键字生成对象和外部设备接口对象等。
实现:•私有构造函数防止在外部实例化。
•保存惟一实例的静态的私有变量。
•初始化并获得惟一实例的静态方法。
比较:•与全局变量的比较:单件模式维护自身的实例化,在使用时是安全的。
一个全局对象无法自行维护,也就无法避免重复创建多个实例,系统资源会被大量占用。
更糟糕的是在很多情况下会出现逻辑问题,当这些对象访问相同的资源(例如串口时)时,会发生访问冲突。
•与实用类静态方法的比较:实用类提供系统公用的静态方法,并且也经常采用私有化的构造函数。
与单件不同,它没有实例,其中的方法全部是静态方法。
(1)实用类不保存状态,仅提供功能。
(2)实用类不具有多态性,而单件可以有子类。
(3)单件是对象,实用类只是方法的集合。
实现:•简单实现public sealed class Singleton{static Singleton instance=null;Singleton(){}public static Singleton Instance{get{if (instance==null){instance = new Singleton();}return instance;}}}这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到Singleton类的多个实例。
如果同时有两个线程去判断(instance == null),并且得到的结果为真,这时两个线程都会创建类Singleton 的实例,这样就违背了Singleton模式的原则。
实际上在上述代码中,有可能在计算出表达式的值之前,对象实例已经被创建,但是内存模型并不能保证对象实例在第二个线程创建之前被发现。
该实现方式主要有两个优点:•由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。
•直到对象要求产生一个实例才执行实例化;这种方法称为"惰性实例化"。
惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
•安全的线程public sealed class Singleton{static Singleton instance=null;static readonly object padlock = new object();Singleton(){}public static Singleton Instance{get{lock (padlock){if (instance==null){instance = new Singleton();}return instance;}}}}这种方式的实现对于线程来说是安全的。