首页 > 其他分享 >设计模式利剑三--抽象工厂方法模型

设计模式利剑三--抽象工厂方法模型

时间:2022-11-09 17:39:08浏览次数:47  
标签:Implements End Sub -- Public 利剑 Human 设计模式 Class


定    义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

优    点:

            1、封装性,每个产品的实现类不是高层模块要关心的,他们关心的是接口,抽象

            2、产品族内的约束为非公开状态,具体的产品族内约束在工厂内实现

缺    点:抽象工厂模式的最大缺点就是产品族扩展非常困难,但是产品等级非常容易扩充

使用场景:一个对象族(或者一组没有任何关系的对象)有相同的约束,则可以使用抽象工厂模式

使用体会:其最大精华在于屏蔽不同对象的差异,对高层做到一致化

实践案例:

             先来看看抽象工厂模式定义的UML图:

设计模式利剑三--抽象工厂方法模型_设计模式

​​           抽象工厂模式是工厂方法模式的升级版本,在多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。下面看看抽象工厂的通用源代码:

设计模式利剑三--抽象工厂方法模型_设计模式_02

​​​                那我们再来看看在工厂模式中设计的女娃造人的工厂模型,忽然发现没有男人和女人,那就是说产品有多样化了,每个种类的人中都有男人和女人之分,为了达到这种产品多样化变化的目的,根据抽象工厂设计原则重新设计如下:

设计模式利剑三--抽象工厂方法模型_class_03

​​​

                 经过以上设计以后,很明显将工厂分成了男人工厂与女人工厂,而一个工厂能够制造黑人、白人、黄种人,所以在一个产品多样化的时候,如何进行分类,如何将不同之处拿出来设计成工厂是一个比较有艺术性的活。想想我们在工厂模型中设计的买煤气吗?如果有一天科技发达了,我们的煤气不仅仅是天然气了,好包括外太空采过来的可燃陨石,还有地球两级的可燃冰,那如果继续让以前的物业来处理这个事情,就明显与职责单一化原则有冲突,所以我们根据抽象工厂模型进行抽象,设计了如下的模型:

设计模式利剑三--抽象工厂方法模型_设计模式_04

            这下好了,租户如果想要可燃冰,那么只需要对可燃冰物业说:给我教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
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

标签:Implements,End,Sub,--,Public,利剑,Human,设计模式,Class
From: https://blog.51cto.com/u_15870687/5837379

相关文章

  • 门面模式VS中介者模式
          门面模式为复杂的子系统提供给一个统一的访问界面,它定义的而是一个高层接口,该接口使得子系统更加容易使用,避免外部模块深入到子系统内部而产生于子系统内部细......
  • 设计模式利剑4-模板方法模式
    定   义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤优   点:            1......
  • 设计模式利剑5-建造者模式
    定   义:将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示优   点:            1、封装性            2、建造者......
  • LINQ编程总结
        LINQtoSQL查询表达式适用于关系数据库,查询表达式是基于对象的,它要求将数据库表和试图映射到实体,LINQTOSQL让数据库的操作变得更加的简单,完全弱化了数据库......
  • 视频融合平台EasyCVR如何调用数据库导入导出接口?
    EasyCVR视频融合平台部署轻快灵活,支持视频汇聚管理,可提供的视频功能包括:视频监控、直播录像、云存储、检索回看、智能告警、平台级联等。有用户提出需求,想要定时保存数据库,......
  • 前端上传图片时添加水印
    前段时间有个功能需要上传图片并添加水印,于是就查了些资料,但是大部分都不太适用,或者说没反应。先说下需要用到的,canvas,添加水印,只能用这个去创建画布,把文字平铺到画布上......
  • 如何用SD NAND解决TF卡所遇到的问题?
    ​ 雷龙发展是专业做存储产品的供应商,跟客户沟通过很多关于存储方面的问题。不知道大家在使用小容量T卡的时候,是否有遇到以下的一些问题: 1、T卡的尺寸(体积)太大了怎么办......
  • 上云网关EasyNTS遇到IP冲突时,如何正确更改IP地址?
    在此前的文章中,我们分享过很多关于EasyNTS上云网关平台及硬件的技术性内容,感兴趣的用户可以翻阅往期的文章进行了解。EasyNTS具备内网穿透、组网运维、多协议视频流拉转推......
  • 计算机网络应用层:DNS、P2P和Socket编程
    DNS域名系统(DomainNameSystem,DNS)的主要任务是主机名到IP地址的转换的目录服务。DNS是:一个由分层DNS服务器实现的分布式数据库;一个使得主机能够查询分布式数据库的应......
  • [Typescript] Contra-variant type positions
    Co-Variance:declareletb:stringdeclareletc:string|numberc=b//✅//stringisasub-typeofstring|number//allelementsofstringappearin......