最近我正在自己学习设计模式,刚学完创建型模式,现在对我的学习到的内容进行归纳总结。我不是一个拘泥于形式的人,不追求标准答案,只追求自己的答案,好了,废话不多说,下面开始总结。
一、设计模式分类
按照设计模式的目的,可分为:创建型、结构型、行为型三种。 创建型模式主要用于对象的创建,结构型模式处理类和对象的组合,行为型模式描述类或对象的职责。
按照设计模式的范围,可分为适用于类和适用于对象两种。类模式处理类和子类间的关系,对象模式处理对象间的关系。
二、创建型模式
1、抽象工厂模式
抽象工厂生产一个系列的抽象产品,着重点在于产品,而不是生产过程。
举个例子,我们要组装一个机器,需要1个零件A、1个零件B和1个零件C。现在有日本厂和德国厂两家工厂生产这些零件,日本厂生产的是日系零件A、日系零件B、日系零件C,德国厂生产的是德系零件A、德系零件B、德系零件C。所以我们组装这个机器就有两种方案,一种是使用日系的零件,一种是使用德系的零件。为了方便地在两种方案间轻松转换,将实现与接口分离,于是我们建一个抽象的工厂,生产抽象的产品零件A、零件B和零件C。这样,我们具体使用了那种方案,生产了哪一系列产品,取决于抽象工厂的实例,即其是日本厂还是德国厂。
抽象工厂适用于一组对象可使用多个不同系列的情况,抽象工厂适用于生产一系列的产品,即产生一系列的多个对象。
2、生成器模式
生成器提供生产一个系列的任一抽象产品的服务(接口),着重点在于生产和组装,而不是产品。
同样举上个例子,我们要定做一个机器,可使用零件A、零件B和零件C进行组合。现在有日本厂和德国厂两家工厂生产这些零件并能够对自己生产的零件进行组装。我们拥有这样两个的方案,一种是委托日本厂生产特定数量的零件A、零件B和零件C并按特定顺序进行组装,一种是委托德国厂生产特定数量的零件A、零件B和零件C并按特定顺序进行组装。为了方便地在两种方案间轻松转换,将实现与接口分离,所以我们抽象了一个生成器,可以生产抽象的零件A、零件B和零件C并将其组装成机器,如何组装,取决于我们如何使用生成器,在什么时候生成何种产品并最后组装成机器。至于生成器生成何种具体产品,取决于具体生成器,即委托日本厂还是德国厂,但我们并不关心。我们只在乎使用生成器生成产品和组装产品。
生成器适用于需要按照特定顺序生产特定数量的一系列产品并进行组装。
3、工厂方法模式
和抽象工厂类似,但抽象工厂适用于生产一个系列的多个抽象产品,而工厂方法更适用于生产单个抽象产品。着重点在于对单个抽象产品进行扩展以及创建具体产品与工作流程的分离。
同样举上个例子,我们要订购一种洗衣机,要求必须有洗涤、排水、甩干三种功能,现在有日本厂和德国厂两家工厂生产这种洗衣机,我们都有购买,现在我们并不在乎,日本厂生产的洗衣机和德国厂生产的洗衣机有什么不同,我们只要求产品有洗涤、排水、甩干三种功能,这样我们就可以为我们的洗衣机写一个统一的操作流程说明书,比如先洗涤,再排水,再甩干。实现创建具体产品与工作流程的分离。如果有一天我们觉得日本厂和德国厂生产的洗衣机的这三种功能不够智能,而美国厂生产的洗衣机有更智能的洗涤、排水、甩干功能,那我们就可以引进美国厂生产的洗衣机,而不用改变工作流程,也不必再重新写洗衣机的操作流程说明书。
工厂方法适用于生产单个有特定功能的抽象产品,我们不太在乎产品具体是什么,我们只在乎可以使用产品的这些特定功能。即创建具体产品与工作流程的分离。
4、原型模式
原型和工厂方法类似,差别在于创建产品的过程,工厂方法是重新做一个新的,原型则是照着模子做一个就可以了。我理解的原型就是一个样品,一个模子,当我们需要生产一个产品时,只需要参照它对应原型的样子,重新做一个就可以了。
看起来原型好像和其他创建模式在创建对象时没有什么本质区别,照着模子做的馒头A,和自己重新做的馒头B,两者似乎可能不同,但对于代码而言,自己重新做的馒头永远都只能是B,同样没有随机性。
这里我也举一个例子,比如上学时老师布置了家庭作业,成绩好的学生A已经完成了,成绩差的学生B没有完成,学生A可以把作业借给B抄,那么学生B可以选择自己做,亦可以选择抄袭学生A的作业。如果学生B选择抄袭,那么此时,学生A的作业就是原型,学生B的作业就是照着原型产生的副本。
总结起来,原型适用于生产不具有通用性、在某些属性上有多种取值的产品。比如皮鞋,有各种尺码、样式,在生产时就需要一个特定的模子。
5、单件(例)模式
这个比较简单,就是利用类命名空间特性,对全局对象使用的一种优化。