首页 > 其他分享 >设计模式你怎么看?--抽象工厂模式

设计模式你怎么看?--抽象工厂模式

时间:2022-11-25 17:04:12浏览次数:48  
标签:CreatProductA -- IProductA 工厂 抽象 IFactory 设计模式 public



一  前言

  在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特点,但有都有共同的特点 工厂(Factory)都是围绕着工厂类转,这篇只写 "抽象工厂"相关的内容 上一篇的地址在这里

设计模式你怎么看?--简单工厂模式

 

二 抽象工厂介绍

 2.1 什么是抽象工厂模式 

  抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象(来自百科)

 

2.2 抽象工厂模式优缺点

  优点:易于更改产品类型 如 可以很方便的更改SqlFactory 与OracleFactory,另外使得客户端于业务层分离,客户端所接触的都是IProductA 和IFactory

     缺点:当新增一种产品类型时改动会较大,例如当需要增加ProductB时需要增加IProductB SqlProductB OracleProductB,还要修改IFactory,SqlFactory,OracleFactory。

 

2.3 抽象工厂模式UML类图

     业务情景如下:在某个系统中未来可能会更换数据库类型如SQLServer,Access ,Oracle 等。要求修改与维护的成本要低。在这种情况下用抽象工厂解决这种问题是很好的因为不同数据库对CRUD操作是语法不完全相同,因此比较好的方法是定义一个抽象类或接口然后让不同的子类去实现自己的变化,再通过各自的工厂方法将实例提供到客户端 

下图正是这么一个过程每个Product都有自己的接口与工厂,在调用时Client调用SqlFactory然后返回SqlProductA的实例到Client中

  

设计模式你怎么看?--抽象工厂模式_数据库

 

三 抽象工厂代码 

  定义工厂的接口规范所有不同类型的工厂类



//工厂接口
public interface IFactory
{
IProductA CreateInstance();
}



 

具体类型的工厂类 用于创建对应类型的产品实例




//Sql类型的工厂类 
class SqlFactory : IFactory
{
public IProductA CreatProductA()
{
return new SqlProductA();
}
}




同上




//Oracle类型的工厂类
class OracleFactory:IFactory
{
public IProductA CreatProductA()
{
return new OracleProductA();
}
}




 

定义具体产品的共有特性




//定义ProductA所共有的方法
public interface IProductA
{
void CreatProductA();

void DeleteProductA();
}




 

具体产品特性的实现




//实现IProductA定义的共有方法
class SqlProductA:IProductA
{
public void CreatProductA()
{
Console.Write("新增SQLServer下的ProductA");
}
public void DeleteProductA()
{
Console.Write("删除一个SQLServer下的ProductA");
}
}




 

 




//实现ProductA共有方法
class OracleProductA:IProductA
{
public void CreatProductA()
{
Console.Write("新增Oracle下的ProductA");
}
public void DeleteProductA()
{
Console.Write("删除一个Oracle下的ProductA");
}
}




 

 

客户端调用 




//SQL类型
IFactory sqlFactory = new SqlFactory();
IProductA sql = sqlFactory.CreatProductA();
sql.CreatProductA();
sql.DeleteProductA();

//Oracle类型
IFactory oracleFactory = new OracleFactory();
IProductA oracle = oracleFactory.CreatProductA();
oracle.CreatProductA();
oracle.DeleteProductA();




结果如下

设计模式你怎么看?--抽象工厂模式_oracle_02

 

 

 四 总结

  设计模式的根本目的是让程序之间的耦合降低,提高程序的健壮性,任何业务的与代码的变化都是要付出代价的。学会把设计模式应用到实际项目中,可以适当的降低这种代价,但任何事都是具有两面性的,减少耦合代码量肯定是要增加的。尝试找到平衡点设计模式就是才是真正用好了。

本人水平有限,如有不对之处还请指出 谢谢~

 

标签:CreatProductA,--,IProductA,工厂,抽象,IFactory,设计模式,public
From: https://blog.51cto.com/u_15834343/5887046

相关文章

  • Apworks简介
    简介Apworks是一款基于Microsoft.NET的面向领域驱动的企业级应用程序开发框架,它适用于以领域模型为核心的企业级系统的开发和集成。Apworks不仅能够很好地支持经典的分层架......
  • ArrayList 与linkedlist区别
    ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。LinkedList使用了循环双......
  • RabbitMQ入门学习系列(二),单生产者消费者
    友情提示我对我的文章负责,发现好多网上的文章没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题。可以直接在公众号《爱码农爱生活》......
  • 利用C#自带组件强壮程序日志
     在项目正式上线后,如果出现错误,异常,崩溃等情况我们往往第一想到的事就是查看日志所以日志对于一个系统的维护是非常重要的贯穿所有的日志系统日志系统,往往是贯穿一个程......
  • 【SHELL】[[ ]]条件判断结构
    实测发现[[]]条件判断结构只支持两级,即if-else非if-elif-else......
  • datatable 转list
    C#DataTable转List方法,网上有好多,之前也收集了,感觉这个也不错,重要是自己要领会这里面的代码含义。接不来我就把代码贴出来分享一下,大家觉得如果不好,请留言我,我来改进。u......
  • 【微信公众号】微信公众号H5【微信网页授权快照页】问题解决方案
    一、网页快照页模式介绍微信网页授权能力调整公告|微信开放社区快照页将会默认对用户屏蔽网页授权弹窗,用户在快照页中仅可进行滑动浏览操作,其他交互将被限制,并提示用户......
  • MySQL的多表查询(笛卡尔积原理)
    先确定数据要用到哪些表。将多个表先通过笛卡尔积变成一个表。然后去除不符合逻辑的数据(根据两个表的关系去掉)。最后当做是一个虚拟表一样来加上条件即可。 注意:列名最好......
  • std::filesystem 使用时编译不过去
    #include<filesystem>namespacefs=std::filesystem;解决方法:https://stackoverflow.com/questions/53201991/how-to-use-stdfilesystem-on-gcc-8实际是需要在编译......
  • web应用程序和Web网站区别
     Vs2005和VS2008中都有建立web应用程序和Web网站,总搞的大家不知所戳。web应用程序可能是微软为了让程序员很好的从winform过渡到web开发而保留了。Web网站就完全要应用......