抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV,还生产海尔冰箱,海尔空调等等,如果使用工厂方法模式就需要产生很多个工厂类来实现,而抽象工厂模式只需要一个工厂类即可生产一个品牌的多种产品。所以抽象工厂模式比工厂方法模式更加简单,有效率。

抽象工厂模式

1.抽象工厂模式动机

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

可以看出,如果使用工厂方法模式,就需要创建20个具体工厂类才能生产上图的所有产品,如果使用抽象工厂模式,只需要4个类,分别是三星厂,松下厂,TCL厂和海尔厂。

2.抽象工厂模式定义

抽象工厂模式就是定义一个可以生产对象的接口,让子类决定要生产哪一个类的接口,工厂方法模式让类的实例化程序延迟到子类中实行。

3.抽象工厂模式的结构图

0818b9ca8b590ca3270a3433284dd417.png

参与者说明:

AbstractFactory(抽象工厂)

△抽象工厂中可一个定义各组方法,每组方法对应着一个产品等级结构(一种类型如风扇)。

ConcreteFactoryA和ConcreteFactoryB(具体工厂)

△实现抽象工厂中的生成抽象产品方法,生产一组具体产品,这类产品形成一个产品族(一个品牌,如TCL),每个产品都位于某个产品的等级结构中。

AbstractProductA和AbstractProductB(抽象产品A和抽象产品B)

△为等级结构中的成员声明抽象业务方法。

ConcreteProduct (A1/A2/B1/B2)(具体产品)

△具体产品,具有唯一的产品族和产品等级结构属性。

4.抽象工厂模式主要代码(一个简单的例子)

抽象产品类

(电视)TV.cs

public interface TV

{

public void Play();

}

(风扇)Fan.cs

public interface Fan

{

public void Play();

}

具体产品类

(海尔电视)HaiErTV.cs

public class HaiErTV : TV

{

public void Play()

{

Console.WriteLine("海尔电视");

}

}

(海尔风扇)HaiErFan.cs

public class HaiErFan : Fan

{

public void Play()

{

Console.WriteLine("海尔风扇");

}

}

(TCL电视)TCLTV.cs

public class TCLTV : TV

{

public void Play()

{

Console.WriteLine("TCL电视");

}

}

(TCL风扇)TCLFan.cs

public class TCLFan : Fan

{

public void Play()

{

Console.WriteLine("TCL风扇");

}

}

抽象工厂类

AbsractFactory.cs

public interface AbstractFactory

{

public TV CreateTV();

public Fan CreateFan();

}

具体工厂类

(海尔)HaiErFactory.cs

public class HaiErFactory : AbstractFactory

{

public TV CreateTV()

{

return new HaiErTV();

}

public Fan CreateFan()

{

return HaiErFan();

}

}

(TCL)TCLFactory.cs

public class TCLFactory : AbstractFactory

{

public TV CreateTV()

{

return new TCLTV();

}

public Fan CreateFan()

{

return TCLFan();

}

}

测试

AbstractFactory factory;/*定义抽象工厂*/

TV tv;/*定义抽象电视*/

Fan fan;/*定义抽象风扇*/

factory = new HaiErFactory();

tv = factory.CreateTV();

tv.Play();/*海尔电视*/

fan = factory.CreateFan();

fan.Play();/*海尔风扇*/

5.总结

优点

△隔离了具体类的生成,是的客户端并不需要知道什么被创建。由于这种隔离,更换了一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。实现高内聚低耦合。

△当一个产品族中的多个对象被设计成一起工作的时候,抽象工厂模式能够保证客户端只使用同一个产品族中的对象。

△增加新的具体工厂和产品族很方便,无需要修改已有系统。

缺点

△在添加新产品对象是,难以拓展抽象工厂来生产新种类的产品,这是因为抽象工厂角色中规定了所有可能被创建的产品集合。要支持新种类的产品就意味着要对该接口进行拓展,需要修改代码。

6.参考

《设计模式》主编:刘伟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值