`

设计模式——工厂模式

阅读更多

当看到“new”就想到“具体”,增加了耦合度。

       提取客户的代码中变化部分(new创建对象),单独创建一个对象(工厂)来处理“new”。这样,创建新类时,我们就不需要修改客户端代码,修改工厂对象即可。也可以把这个工厂定义为静态方法(静态工厂)

 

简单工厂模式

简单工厂模式的工厂类一般采用静态方法,通过接收不同的参数决定返回不同的对象(根据不同的条件创建不同实例)。工厂类集中了所有实例的逻辑,违反了高内聚这一原则,它所能创建的类只能是事先考虑好的,如果一旦添加新的类就需要改变工厂类了

 

工厂方法模式

定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法(接口中创建对象的方法)让类把实例化延迟到子类.

工厂方法模式类图:

与简单工厂的区别:简单工厂是将对象的创建封装起来,但是它不具备工厂方法的弹性(ConcreteCreator可以有多个,需要哪个就调用哪个),不能变更正在创建的产品。

工厂方法模式的核心工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去完成,这就允许系统在不修改工厂角色的情况下,创建新的产品。

设计原则:要依赖抽象,不要依赖具体类。即不能让高层组件依赖低层组件,并且两者都应该依赖抽象。

依赖倒置原则(如果具体类不会改变则不需要遵守):

  1. 变量不可以持有具体对象的引用(new就会持有具体类,可以使用工厂)

  2. 不要让类派生自具体类(派生自抽象)

  3. 不要覆盖基类已实现的方法

 

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类

与工厂方法模式的区别:工厂方法使用继承,抽象工厂使用组合,而且适用于产生一系列产品集合,可以用来产生新产品集合,但是如果增加一个新产品,则要改动几乎所有的工厂类

 

区别

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族) 

 

 

 

工厂方法模式与抽象工厂模式

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
    
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
对于java来说,大部分抽象工厂模式都是这样的:
---它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。

比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。

这样A和B就是工厂,对应于抽象工厂;
每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;

用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)

所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics