[b]解读工厂模式[/b](本身应用了多态,用于解耦):工厂模式本身是为了不去了解具体产品类实现及初始化过程,而由工厂生产出产品实例。
1、[b]简单工厂[/b](simple Factory) :把对象(具有统一接口)的创建封装起来,不需要去了解具体类的实现情况,只需要向简单工厂传递参数,由工厂去根据参数来创建所需的具体实例。(优点:需求增加或改变时,只需要更改工厂类,而不需要改变产品类。 缺点:增加一个新产品类时,必须更改工厂类)
a)定义一个接口
b)各子类实现这个接口
c)定义一个工厂类,其中取实例方法会判断传入的参数而进行实例不同的对象
2、[b]工厂方法[/b](Method Factory pattern):为了解决简单工厂的缺点,工厂方法使在使用时实例化一个具体的产品工厂,这样在增加一个新产品时,只需要为其再创建一个产品工厂类,再使用时使用新产品工厂类。(优点:符合开闭原则。缺点:会造成工厂类泛滥。)
a)定义一个工厂接口
b)定义产品类接口
c)定义各产品类实现产品接口
d)为每个产品类定义工厂类,实现工厂接口
e)根据不同情况实例化不同的工厂类,以产生不同的产品类对象
[b]适用场景:[/b]
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3、[b]抽象工厂[/b]:可以解决工厂方法的工厂类泛滥问题,但同时也限制了产生一系列的产品。(优点:可以产生不同的产品流水线,但不同系列的产品具有相似性。缺点:不灵活)
a)定义一个工厂类接口,封装的方法产生一系列的产品
b)定义一系列产品类接口,不同产品继承不同接口。如:武器系列包含刀剑,铁制武器系列继承自武器系列,包含铁剑铁刀,而铁剑继承自剑,铁刀继承自铁刀。
适用场景:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
[b]三者比较:[/b]
1、在产品种类固定时,又不想去了解产品底层的实现细节,使用简单工厂,甚至都不用知道具体产品名称。
2、在产品种类不固定时,可以使用工厂方法
3、若产品是分代的,就可以使用抽象工厂。当产品只有一种时,退化为工厂方法
1、[b]简单工厂[/b](simple Factory) :把对象(具有统一接口)的创建封装起来,不需要去了解具体类的实现情况,只需要向简单工厂传递参数,由工厂去根据参数来创建所需的具体实例。(优点:需求增加或改变时,只需要更改工厂类,而不需要改变产品类。 缺点:增加一个新产品类时,必须更改工厂类)
a)定义一个接口
b)各子类实现这个接口
c)定义一个工厂类,其中取实例方法会判断传入的参数而进行实例不同的对象
2、[b]工厂方法[/b](Method Factory pattern):为了解决简单工厂的缺点,工厂方法使在使用时实例化一个具体的产品工厂,这样在增加一个新产品时,只需要为其再创建一个产品工厂类,再使用时使用新产品工厂类。(优点:符合开闭原则。缺点:会造成工厂类泛滥。)
a)定义一个工厂接口
b)定义产品类接口
c)定义各产品类实现产品接口
d)为每个产品类定义工厂类,实现工厂接口
e)根据不同情况实例化不同的工厂类,以产生不同的产品类对象
[b]适用场景:[/b]
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3、[b]抽象工厂[/b]:可以解决工厂方法的工厂类泛滥问题,但同时也限制了产生一系列的产品。(优点:可以产生不同的产品流水线,但不同系列的产品具有相似性。缺点:不灵活)
a)定义一个工厂类接口,封装的方法产生一系列的产品
b)定义一系列产品类接口,不同产品继承不同接口。如:武器系列包含刀剑,铁制武器系列继承自武器系列,包含铁剑铁刀,而铁剑继承自剑,铁刀继承自铁刀。
适用场景:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
[b]三者比较:[/b]
1、在产品种类固定时,又不想去了解产品底层的实现细节,使用简单工厂,甚至都不用知道具体产品名称。
2、在产品种类不固定时,可以使用工厂方法
3、若产品是分代的,就可以使用抽象工厂。当产品只有一种时,退化为工厂方法