# 工厂模式

属于创建型模式,是常用的设计模式之一。
工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。

优点

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。
  2. 扩展性高,如果想增加一个产品,只需要增加这个产品的类就可以了。
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

  1. 使用 CSharp 反射动态创建对象会有性能消耗
  2. 一定程度上增加了系统的复杂度

# 类图

  1. 创建接口,由具体的类实现接口
  2. 创建工厂类,利用反射动态创建对象

img

# 代码

# 接口

namespace CreationalPatterns_FactoryPattern
{
    public interface IShape
    {
        /// <summary>
        /// 形状
        /// </summary>
        public void MyShape();
    }
}
namespace CreationalPatterns_FactoryPattern
{
    public interface IEffect
    {
        /// <summary>
        /// 效果
        /// </summary>
        public void MyEffect();
    }
}

# 实现接口的类

  • 实现接口的类需要有命名规则:类名 + 特定的字符
namespace CreationalPatterns_FactoryPattern
{
    public class RoundShape : IShape
    {
        public void MyShape()
        {
            Console.WriteLine("圆形");
        }
    }
}
namespace CreationalPatterns_FactoryPattern
{
    public class SquareShape : IShape
    {
        public void MyShape()
        {
            Console.WriteLine("正方形");
        }
    }
}
namespace CreationalPatterns_FactoryPattern
{
    internal class ExplodeEffect : IEffect
    {
        public void MyEffect()
        {
            Console.WriteLine("爆炸");
        }
    }
}
namespace CreationalPatterns_FactoryPattern
{
    internal class TransparencyEffect : IEffect
    {
        public void MyEffect()
        {
            Console.WriteLine("透明");
        }
    }
}

# 工厂

  • 利用泛型方法将 “创建对象” 与 “创建某个具体的对象” 分离开
  • 根据命名规则,利用反射创建对象(命名空间. + 类名 + 特定的字符)
  • 如果反复创建同一个物体会造成浪费,所以用一个字典储存起来(这不是必要的,需要看需求)
namespace CreationalPatterns_FactoryPattern
{
    public class CreateFactory
    {
        /// <summary>
        /// 储存已生成的对象,循环利用
        /// </summary>
        private static Dictionary<string, object> Cache = new Dictionary<string, object>();
        /// <summary>
        /// 创建对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="className"> 类名 & lt;/param>
        /// <returns></returns>
        private static T CreateObject<T>(string className) where T : class
        {
            if (Cache.ContainsKey(className))
            {
                return Cache[className] as T;
            }
            else
            {
                Type type = Type.GetType(className);
                object temp = Activator.CreateInstance(type);
                Cache.Add(className, temp);
                return temp as T;
            }
        }
        /// <summary>
        /// 创建形状
        /// </summary>
        /// <param name="shapeName"> 形状 & lt;/param>
        /// <returns></returns>
        public static IShape GetShape(string shapeName)
        {
            // 命名规则:CreationalPatterns_FactoryPattern. + 形状 + Shape
            string className = string.Format("CreationalPatterns_FactoryPattern.{0}Shape", shapeName);
            return CreateObject<IShape>(className);
        }
        /// <summary>
        /// 创建效果
        /// </summary>
        /// <param name="effectName"> 效果 & lt;/param>
        /// <returns></returns>
        public static IEffect GetEffect(string effectName)
        {
            // 命名规则:CreationalPatterns_FactoryPattern. + 效果 + Effect
            string className = string.Format("CreationalPatterns_FactoryPattern.{0}Effect", effectName);
            return CreateObject<IEffect>(className);
        }
    }
}

# 测试

namespace CreationalPatterns_FactoryPattern
{
    public class Program
    {
        private static void Main()
        {
            CreateFactory.GetShape("Round").MyShape();
            CreateFactory.GetShape("Square").MyShape();
            CreateFactory.GetEffect("Explode").MyEffect();
            CreateFactory.GetEffect("Transparency").MyEffect();
        }
    }
}

运行结果:
圆形
正方形
爆炸
透明

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Maikire 微信支付

微信支付

Maikire 支付宝

支付宝

Maikire 贝宝

贝宝