一 前言
在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特点,但有都有共同的特点 工厂(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();
结果如下
四 总结
设计模式的根本目的是让程序之间的耦合降低,提高程序的健壮性,任何业务的与代码的变化都是要付出代价的。学会把设计模式应用到实际项目中,可以适当的降低这种代价,但任何事都是具有两面性的,减少耦合代码量肯定是要增加的。尝试找到平衡点设计模式就是才是真正用好了。
本人水平有限,如有不对之处还请指出 谢谢~
如果您觉得本文有给您带来一点收获,不妨点个推荐,为我的付出支持一下,谢谢~
如果希望在技术的道路上能有更多的朋友,那就关注下我吧,让我们一起在技术的路上奔跑