在设计模式中有简单工厂,工厂方法,抽象工厂,这三种工厂方法,各自有各自的特色,但有都有共同的特色 工厂(Factory)都是围绕着工厂类转,这篇只写 "抽象工厂"相关的内容 上一篇的地址在这里html
2.1 什么是抽象工厂模式 sql
抽象工厂模式是全部形态的工厂模式中最为抽象和最具通常性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式能够向客户端提供一个接口,使客户端在没必要指定产品的具体的状况下,建立多个产品族中的产品对象(来自百科)数据库
2.2 抽象工厂模式优缺点设计模式
优势:易于更改产品类型 如 能够很方便的更改SqlFactory 与OracleFactory,另外使得客户端于业务层分离,客户端所接触的都是IProductA 和IFactoryoracle
缺点:当新增一种产品类型时改动会较大,例如当须要增长ProductB时须要增长IProductB SqlProductB OracleProductB,还要修改IFactory,SqlFactory,OracleFactory。post
2.3 抽象工厂模式UML类图url
业务情景以下:在某个系统中将来可能会更换数据库类型如SQLServer,Access ,Oracle 等。要求修改与维护的成本要低。在这种状况下用抽象工厂解决这种问题是很好的由于不一样数据库对CRUD操做是语法不彻底相同,所以比较好的方法是定义一个抽象类或接口而后让不一样的子类去实现本身的变化,再经过各自的工厂方法将实例提供到客户端 spa
下图正是这么一个过程每一个Product都有本身的接口与工厂,在调用时Client调用SqlFactory而后返回SqlProductA的实例到Client中设计
定义工厂的接口规范全部不一样类型的工厂类3d
//工厂接口 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();
结果以下
设计模式的根本目的是让程序之间的耦合下降,提升程序的健壮性,任何业务的与代码的变化都是要付出代价的。学会把设计模式应用到实际项目中,能够适当的下降这种代价,但任何事都是具备两面性的,减小耦合代码量确定是要增长的。尝试找到平衡点设计模式就是才是真正用好了。
本人水平有限,若有不对之处还请指出 谢谢~
若是您以为本文有给您带来一点收获,不妨点个推荐,为个人付出支持一下,谢谢~
若是但愿在技术的道路上能有更多的朋友,那就关注下我吧,让咱们一块儿在技术的路上奔跑