定 义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
优 点:
1、封装性,每个产品的实现类不是高层模块要关心的,他们关心的是接口,抽象
2、产品族内的约束为非公开状态,具体的产品族内约束在工厂内实现
缺 点:抽象工厂模式的最大缺点就是产品族扩展非常困难,但是产品等级非常容易扩充
使用场景:一个对象族(或者一组没有任何关系的对象)有相同的约束,则可以使用抽象工厂模式
使用体会:其最大精华在于屏蔽不同对象的差异,对高层做到一致化
实践案例:
先来看看抽象工厂模式定义的UML图:
抽象工厂模式是工厂方法模式的升级版本,在多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。下面看看抽象工厂的通用源代码:
那我们再来看看在工厂模式中设计的女娃造人的工厂模型,忽然发现没有男人和女人,那就是说产品有多样化了,每个种类的人中都有男人和女人之分,为了达到这种产品多样化变化的目的,根据抽象工厂设计原则重新设计如下:
经过以上设计以后,很明显将工厂分成了男人工厂与女人工厂,而一个工厂能够制造黑人、白人、黄种人,所以在一个产品多样化的时候,如何进行分类,如何将不同之处拿出来设计成工厂是一个比较有艺术性的活。想想我们在工厂模型中设计的买煤气吗?如果有一天科技发达了,我们的煤气不仅仅是天然气了,好包括外太空采过来的可燃陨石,还有地球两级的可燃冰,那如果继续让以前的物业来处理这个事情,就明显与职责单一化原则有冲突,所以我们根据抽象工厂模型进行抽象,设计了如下的模型:
这下好了,租户如果想要可燃冰,那么只需要对可燃冰物业说:给我教A公司的煤气过来,则我们自然会收到可燃冰煤气,这样设计是否非常的简单?但是看看这种模式的不合理之处,如果我再想增加一个D煤气公司煤气,那么我要修改很多地方,所有物业公司相关的接口以及子类都需要添加叫D公司煤气的方法。
来看看抽象工厂实现的代码:
Public Interface IHumanFactory
Function createYellowHuman() As Human
Function createWhiteHuman() As Human
Function createBlackHuman() As Human
End Interface ' IHumanFactory
Public Class FemaleFactory
Implements IHumanFactory
Public Function createYellowHuman() As Human Implements IHumanFactory.createYellowHuman
Return New FemaleYellowHuman()
End Function
Public Function createWhiteHuman() As Human Implements IHumanFactory.createWhiteHuman
Return New FemaleWhiteHuman
End Function
Public Function createBlackHuman() As Human Implements IHumanFactory.createBlackHuman
Return New FemaleBlackHuman
End Function
Public Sub getSex()
End Sub
End Class ' FemaleFactory
Public Class MaleFactory
Implements IHumanFactory
Public Function createYellowHuman() As Human Implements IHumanFactory.createYellowHuman
Return New MaleYellowHuman
End Function
Public Function createWhiteHuman() As Human Implements IHumanFactory.createWhiteHuman
Return New MaleWhiteHuman
End Function
Public Function createBlackHuman() As Human Implements IHumanFactory.createBlackHuman
Return New MaleBlackHuman
End Function
Public Sub getSex()
End Sub
End Class ' MaleFactory
Public Interface Human
Sub getColor()
Sub talk()
Sub getSex()
End Interface ' Human
Public MustInherit Class BlackHuman
Implements Human
Public Sub getColor() Implements Human.getColor
Console.WriteLine("黑色人种皮肤是黑色的")
End Sub
Public Sub talk() Implements Human.talk
Console.WriteLine("黑色人种语言为英语")
End Sub
Public MustOverride Sub getSex() Implements Human.getSex
End Class ' BlackHuman
Public MustInherit Class WhiteHuman
Implements Human
Public Sub getColor() Implements Human.getColor
Console.WriteLine("白种人皮肤是白色的")
End Sub
Public Sub talk() Implements Human.talk
Console.WriteLine("白种人讲话时英语")
End Sub
Public MustOverride Sub getSex() Implements Human.getSex
End Class ' WhiteHuman
Public MustInherit Class YellowHuman
Implements Human
Public Sub getColor() Implements Human.getColor
Console.WriteLine("黄种人皮肤是黄色的")
End Sub
Public Sub talk() Implements Human.talk
Console.WriteLine("黄种人语言是中文")
End Sub
Public MustOverride Sub getSex() Implements Human.getSex
End Class ' YellowHuman
Public Class FemaleBlackHuman标签:Implements,End,Sub,--,Public,利剑,Human,设计模式,Class From: https://blog.51cto.com/u_15870687/5837379
Inherits BlackHuman
Public Overrides Sub getSex()
Console.WriteLine("黑人女性")
End Sub
End Class ' FemaleBlackHuman
Public Class FemaleWhiteHuman
Inherits WhiteHuman
Public Overrides Sub getSex()
Console.WriteLine("白人女性")
End Sub
End Class ' FemaleWhiteHuman
Public Class FemaleYellowHuman
Inherits YellowHuman
Public Overrides Sub getSex()
Console.WriteLine("黄种人女性")
End Sub
End Class ' FemaleYellowHuman
Public Class MaleBlackHuman
Inherits BlackHuman
Public Overrides Sub getSex()
Console.WriteLine("黑人男性")
End Sub
End Class ' MaleBlackHuman
Public Class MaleWhiteHuman
Inherits WhiteHuman
Public Overrides Sub getSex()
Console.WriteLine("白人男性")
End Sub
End Class ' MaleWhiteHuman
Public Class MaleYellowHuman
Inherits YellowHuman
Public Overrides Sub getSex()
Console.WriteLine("黄种人男性")
End Sub
End Class ' MaleYellowHuman