简单工厂模式

一、引子

十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。
你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!
引用文章:

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

二、c# 版简单工厂模式

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。

它由三种角色组成:
工厂类角色:这是本模式的核心,一般包含了判断逻辑和部分处理逻辑,根据逻辑的不同,产生具体的产品。如例子中的 CarFactory 类。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的 Car 抽象类。
具体产品角色:工厂类所创建的对象就是此角色的实例。在 C# 中由具体类实现,如例子中的 RedCar 、BlueCar 类。

类图请参考 原文章。

以控制台程序为例.

先定义好抽象的车(抽象类).

        /// <summary>
        /// 抽象车类
        /// </summary>
        public abstract class Car 
        {
            /// <summary>
            /// 跑 方法
            /// </summary>
            public abstract void run();
            
        }

接下来继承抽象车类,具体的类(具体的产品类):

        /// <summary>
        /// 默认的普通车
        /// </summary>
        public class DefaultCar : Car
        {
            public override void run()
            {
                Console.WriteLine("I'm a DefaultCar,I'm running!");
            }
        }


        /// <summary>
        /// 红车
        /// </summary>
        public class RedCar : Car
        {
            public override void run()
            {
                Console.WriteLine("I'm a RedCar,I'm running!");
            }
        }


        /// <summary>
        /// 蓝车
        /// </summary>
        public class BlueCar : Car
        {
            public override void run()
            {
                Console.WriteLine("I'm a BlueCar,I'm running!");
            }
        }

接下来,我们实现一下工厂类,将对应的车取出来:

        /// <summary>
        /// 车工厂
        /// </summary>
        public class CarFactory
        {
            /// <summary>
            /// 根据车的颜色得到具体的车
            /// </summary>
            /// <param name="carColor"></param>
            /// <returns></returns>
            public static Car GetCar(string carColor)
            {
                Car ResultItem = null;
                switch (carColor)
                {
                    case "red":
                        ResultItem = new RedCar();
                        break;
                    case "blue":
                        ResultItem = new BlueCar();
                        break;
                    default:
                        ResultItem = new DefaultCar();
                        break;
                }
                return ResultItem;
            }
        }

调用试下:

        static void Main(string[] args)
        {
            Car cItem = null;
            Console.WriteLine("Red Car coming!");
            cItem = CarFactory.GetCar("red");
            cItem.run();

            Console.WriteLine("Blue Car coming!");
            cItem = CarFactory.GetCar("blue");
            cItem.run();

            Console.WriteLine("Default Car coming!");
            cItem = CarFactory.GetCar("");
            cItem.run();
            Console.ReadLine();
        }

这样,我们就完成了一个简单工厂例子,用户不用管它内部是什么处理逻辑,只需要告诉工厂类,我要什么东西,工厂类返回对应的类给用户,让用户去调用,用户不需要去管它是红车还是蓝车,可以直接使用。

原文地址:https://www.cnblogs.com/Frank-Jan/p/8868371.html