zoukankan      html  css  js  c++  java
  • 简单工厂模式

    一、引子

    十年前,有一个爆发户,他家有三辆汽车(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();
            }

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

  • 相关阅读:
    在千万级的数据库查询中,如何提高效率?
    SQL的触发器和存储过程详解
    如何提高mysql的安全性?
    mysql的触发器
    HDU5564 Clarke and digits
    JOI2014Final 飞天鼠
    Topcoder10073 SRM418 BarracksEasy
    Topcoder9902 SRM416 DancingCouples
    Topcoder8307 SRM390 SetOfPatterns
    POJ1741 Tree(点分治)
  • 原文地址:https://www.cnblogs.com/Frank-Jan/p/8868371.html
Copyright © 2011-2022 走看看