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();
            }

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

  • 相关阅读:
    个人收集
    30个提高Web程序执行效率的好经验
    如何进行有效的代码检查
    软件测试杂谈
    论dotnet应用程序通用开发方法的弊端
    给Linux增加硬盘的方法
    知识分子的生活态度
    深入认识敏捷开发和面向对象
    使用自定义主题让Windows Live Writer在本地预览语法高亮效果
    软件工程项目中数据库的作用以及敏捷开发
  • 原文地址:https://www.cnblogs.com/Frank-Jan/p/8868371.html
Copyright © 2011-2022 走看看