前置文章: 设计模式的原则 

其他设计模式:用心理解设计模式专栏

设计模式相关代码已统一放至 我的 Github

 

一、定义

  创建型模式之一。

  静态 工厂方法模式

二、结构解析:

  它的一般结构有三种角色:抽象产品、具体产品、工厂。

  抽象产品,描述了所有具体产品的公共属性;

  具体产品,是工厂要创建的目标;

  工厂,提供了一个“静态工厂方法”,用来创建具体产品对象。

  所以通常,简单工厂模式也被称为静态工厂方法模式。

三、评价

  简单工厂模式封装了产品创建过程,使用者不需要亲力制造,只需输入创建条件参数即可得到想要得到的产品对象。

  简单工厂模式使产品类和使用者得以解耦。

四、实现

  简单工厂模式的实质是一个根据传入的条件参数,决定应该创建哪一个产品类的静态方法。

  为什么是静态方法?

  因为,静态方法属于类所有,不和类对象产生联系,很容易从所在类中拆卸; 从调用的角度来说,可以免去 创建产品时先创建工厂这一步骤,避免内存分配。

using System;

//简单工厂模式,根据条件创建
namespace SimpleFactory
{
    //抽象产品类
    public abstract class Product { }

    //具体产品类
    public class ConcreteProduct1 : Product { }
    public class ConcreteProduct2 : Product { }

    //示例, 使用枚举作为创建参数
    public enum ProductType
    {
        Product1,
        Product2
    }
    //可扩展新的具体产品
    //...

    //工厂类
    public class Factory
    {
        //静态工厂方法
        public static Product StaticFactorMethod(ProductType productType)
        {
            Product product = null;
            switch (productType)
            {
                case (ProductType.Product1):
                    product = new ConcreteProduct1();
                    break;
                case (ProductType.Product2):
                    product = new ConcreteProduct2();
                    break;
                //...
            }
            return product;
        }
    }

    public class Client
    {
        private void Main()
        {
            //使用静态工厂方法创建具体产品1
            Factory.StaticFactorMethod(ProductType.Product1);
            //使用静态工厂方法创建具体产品2
            Factory.StaticFactorMethod(ProductType.Product2);
        }
    }
}

  缺点:违背开闭原则,新增产品需要修改静态工厂方法,当产品种类过多时,该创建方法会显得臃肿。

五、泛型简单工厂模式

  通常,既然多个对象可以通过一个接口统一创建,那他们的构造参数一般都是一致的,要做的只是需要在创建时根据条件参数确定类型。

  为了避免以上缺点,可利用泛型进行实现。

 1.泛型静态工厂方法

using System;

//简单工厂模式,泛型静态工厂方法实现
namespace SimpleFactory.GenericFunction
{
    //抽象产品类
    public abstract class Product { }

    //具体产品类
    public class ConcreteProduct1 : Product { }
    public class ConcreteProduct2 : Product { }
    //可扩展新的具体产品
    //...

    //工厂类
    public class Factory
    {
        //静态工厂方法
        public static T StaticFactorMethod<T>()
        {
            return Activator.CreateInstance<T>();
        }
    }

    public class Client
    {
        private void Main()
        {
            //使用静态工厂方法创建具体产品1
            Factory.StaticFactorMethod<ConcreteProduct1>();
            //使用静态工厂方法创建具体产品2
            Factory.StaticFactorMethod<ConcreteProduct2>();
        }
    }
}

 2.泛型工厂类

  注意:为了按类型创建工厂,创建方法应作为工厂的一部分。不能使用静态。

  需要将原有的静态方法改为非静态。

using System;

//简单工厂模式,泛型类实现
namespace SimpleFactory.GenericClass
{
    //抽象产品类
    public abstract class Product { }

    //具体产品类
    public class ConcreteProduct1 : Product { }
    public class ConcreteProduct2 : Product { }
    //可扩展新的具体产品
    //...

    //泛型工厂类
    public class Factory<T>
    {
        //工厂方法
        public T FactorMethod()
        {
            return Activator.CreateInstance<T>();
        }
    }

    public class Client
    {
        private void Main()
        {
            new Factory<ConcreteProduct1>().FactorMethod();
            new Factory<ConcreteProduct2>().FactorMethod();
        }
    }
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐