首页 > 代码库 > iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式


怎样理解简单工厂,工厂方法。 抽象工厂三种设计模式?

 

简单工厂的生活场景。卖早点的小摊贩。他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂。它生产包子,馒头,地沟油烙的煎饼。

该场景相应的UML图例如以下所看到的:

技术分享

图1:简单工厂模式UML图


简单工厂模式的參与者:

 

工厂(Factory)角色:接受client的请求,通过请求负责创建对应的产品对象。

 

抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共有的接口。但是抽象类或接口。

 

详细产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。

 

简单工厂模式的演变:

1.当系统中仅仅有唯一的产品时,能够省略抽象产品,如图1所看到的。这样。工厂角色与详细产品能够合并。

 

简单工厂模式的优缺点:

1.)工厂类含有必要的创建何种产品的逻辑。这样client仅仅须要请求须要的产品,而不须要理会产品的实现细节。

2.)工厂类仅仅有一个,它集中了全部产品创建的逻辑。它将是整个系统的瓶颈,同一时候造成系统难以拓展。

3.)简单工厂模式通常使用静态工厂方法,这使得工厂类无法由子类继承,这使得工厂角色无法形成基于继承的等级结构。


2. 工厂方法模式

工厂方法使用OOP的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的接口。然后在详细的工厂中创建详细的产品。工厂方法的生活场景,联合利华要生产“夏士莲”和“清扬两款洗发水,它会建一个生产“夏士莲的工厂和一个生产“清扬的工厂。

技术分享

图2:工厂方法的UML图

工厂方法模式中的參与者:

 

抽象工厂角色:与应用程序无关,不论什么在模式中创建对象的工厂必须实现这个接口。


详细工厂角色:实现了抽象工厂接口的详细类。含有与引用密切相关的逻辑,而且受到应用程序的调用以创建产品对象。
抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共有的接口。
详细产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每一个详细产品对象都是某个详细产品角色的实例。

 

 

工厂方法的优缺点:

 

1.减少了工厂类的内聚。满足了类之间的层次关系,又非常好的符合了面向对象设计中的单一职责原则。这样有利于程序的拓展。如图三所看到的:
技术分享

图3:工厂方法的拓展UML图

总结:共性提取出来,依据各自的个性建立各自的继承共性的实现


3. 抽象工厂设计模式

所谓抽象工厂是指一个工厂等级结构能够创建出分属于不同产品等级结构的一个产品族中的全部对象。以创建Unix控件和Windows控件为例说明。我们须要一个抽象工厂以下有两个子工厂,一个叫做UnixFactory,用于生产Unix族控件,一个叫做WinFactory,用于生产Win族控件。抽象工厂与工厂方法的差别是,工厂方法中的详细工厂一般仅仅生产一个或几个控件对象,而抽象工厂中的详细工厂生产的是一族控件对象。

如图4所看到的。

技术分享

图4:抽象工厂设计模式UML图


抽象工厂中的參与者:

抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。

详细工厂(Concrete Factory)角色:这个角色直接在client的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共有的接口。

详细产品(Concrete Product)角色:抽象工厂模式所创建的不论什么产品对象都是某一个详细产品类的实例。

这是client终于须要的东西。其内部一定充满了应用系统的商业逻辑。

 

抽象工厂的使用场景:

  • 一个系统不应当依赖于产品类实例怎样被创建、组合和表达的细节,这对于全部形态的工厂模式都是重要的。
  • 这个系统有多于一个的产品族,而系统仅仅消费当中某一产品族。
  • 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,全部的产品以相同的接口出现。从而使client不依赖于实现。

 

抽象工厂模式与工厂方法模式的差别

 

工厂方法模式:每一个抽象产品派生多个详细产品类,每一个抽象工厂类派生多个详细工厂类,每一个详细工厂类负责一个详细产品的实例创建; 
抽象工厂模式:每一个抽象产品派生多个详细产品类。每一个抽象工厂派生多个详细工厂类,每一个详细工厂负责多个(一系列)详细产品的实例创建。 



//在UIKit框架下,我们用工厂方法和抽象工厂两种设计模式分别实现了两份Demo, 不理解两种设计模式该怎样实现的朋友能够到这里下载:  


抽象工厂: http://download.csdn.net/detail/luozhonglan/8008001

工厂方法: http://download.csdn.net/detail/luozhonglan/8007973



參考文章:

简单工厂: http://blog.csdn.net/z251257144/article/details/7476849

工厂方法:http://blog.csdn.net/z251257144/article/details/7479183

抽象工厂:http://blog.csdn.net/z251257144/article/details/7482810




iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)