客户端实现
IFruitFactory fac = new AFactory(); Fruit a_Apple = fac.CreateApple("a工厂"); Fruit a_Orange = fac.CreateOrange("a工厂"); a_Apple.PrintfName(); a_Orange.PrintfName(); IFruitFactory b_fac = new BFactory(); Fruit b_Apple = b_fac.CreateApple("b工厂"); Fruit b_Orange = b_fac.CreateOrange("b工厂"); b_Apple.PrintfName(); b_Orange.PrintfName();小白:“可是在什么样的场景下用这种模式呢,我好像一下子想不到”
老师:“抽象工厂的使用相对来说比较少,但也不是没有。我举一个例子,在后端开始中我们有各种的组件【按钮,抽屉,导航栏】等等,这些组件有对应的皮肤,对皮肤的开发就是抽象工厂的实现。工厂接口是对每个组件的定义,每个皮肤就是一个工厂的实现。如果要切换皮肤,只需要实例化不同的工厂即可。”
小白:“哦。就和游戏中的皮肤切换一样吗?”
老师:“你也可以这样理解,设计模式只是一种通用解决方案,可以应用在不同的场景下,大家可以挑最适应自己,最好理解的场景下手。”
下课铃声又响起了
老师:“好了,这节课就到这里。下节课我们讲其他的设计模式,希望大家准时听讲。”
优/缺点抽象工厂是应对产品族概念的。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。比如,每个汽车公司可能要同时生产轿车、货车、客车,那么每一个工厂都要有创建轿车、货车和客车的方法
优点:向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象
缺点:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性