在开发中,工厂模式为我们提供了一种松耦合的形式,在一些需要频繁构造比较复杂的对象时,就可以使用工厂模式,通过对象工厂为我们提供实例,这样在后期维护的时候可以统一的对实例对象的过程进行管理升级。
工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式:
先看一下代码:
static class SimpleFactoryPattern { public static IProduct makeProduct(ProductClass pc) { //返回对应的实例 switch (pc) { case ProductClass.one: return new ProductOne(); case ProductClass.two: return new ProductTo(); } throw new Exception("no this product"); } } enum ProductClass { one, two, } //将产品抽象 interface IProduct { void Production(); } class ProductOne : IProduct { public void Production() { Console.WriteLine("产品1"); } } class ProductTo : IProduct { public void Production() { Console.WriteLine("产品2"); } }
简单工厂模式的代码逻辑比较容易理解,它的主要优点是:客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确,客户端无需知道所创建具体产品的类名,只需知道参数即可,但是它的缺点也显而易见:简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
因此,经过进一步发展,工厂方法模式出现了。
工厂方法模式:
工厂方法模式是对简单工厂模式的进一步抽象化。它将工厂也部分抽象出来,对应的每个工厂只生产一个实例。用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程,对于新产品的创建,只需多写一个相应的工厂类,我们下面看一下实现代码:
interface IFactory { IProduct makeProduct(); } class FactoryMethodPatternOne : IFactory { public IProduct makeProduct() { return new ProductOne(); } } class FactoryMethodPatternTwo : IFactory { public IProduct makeProduct() { return new ProductTo(); } } interface IProduct { void Production(); } class ProductOne : IProduct { public void Production() { Console.WriteLine("产品1"); } } class ProductTo : IProduct { public void Production() { Console.WriteLine("产品2"); } }
当然,这种逻辑,还是存在着问题,一个工厂只能生产一个类,增加了代码复杂度,而且难以理解,为了更好的完善工厂模式,后来又推出了新的工厂模式:抽象工厂模式。
抽象工厂模式:
抽象工厂将工厂彻底抽象出来,每个抽象工厂可以生产多种相互关联的对象,像华为生产不只生产手机,还生产电脑,平板。下面看一下代码:
interfaceIFactory { IProduct makeCar(); IProduct makeClothes(); } class FactoryOne : IFactory { public IProduct makeCar() { return new BYD(); } public IProduct makeClothes() { return new Lining(); } } interface IProduct { void Production(); } class Lining : IProduct { public void Production() { Console.WriteLine("产品1"); } } class BYD : IProduct { public void Production() { Console.WriteLine("产品2"); } }
但是抽象工厂模式,半违背开发-封闭原则:
-
当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。
-
当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。
这三个工厂模式,都有自己的应用场景,不必过于纠结其缺点,开发时最合适的就是最好的。
这是我的公众号二维码,获取最新文章,请关注此号