显示列表

意图
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式不属于23个GOF模式。

简单工厂模式中涉及到的角色
1) 抽象产品角色:定义具体产品角色要实现的接口。可以用一个接口或者抽象类实现。
2) 具体产品角色:实现抽象产品角色所定义的接口。
3) 工厂角色:该角色是简单工厂模式的核心。通常根据参数创建一个具体产品的实例。

一个例子
在程序中,要用到一个车的类,就创建一个实例,但当车很多变时,会不断的有新的车出现,那么每次都要增加一个新的车类,还要修改客户程序。使用简单工厂模式可以减少修改的地方。


using System;


namespace Pattern.SimpleFactory
{
    public class Test
    {
        public static void Main()
        {
            Car car;

            Label_001:
            Console.Write("请输入车名:");
            string carType = Console.ReadLine();
            
            car = CarFactory.GetCar(carType); // 返回车的实例。
            if (car == null)
            {
             Console.Write("可能没有这辆车。");
                Console.WriteLine();
                goto Label_001;
            }

            car.Start();
            car.Run();
            car.Stop();
            Console.WriteLine();

            goto Label_001;
            //Console.ReadKey();
        }
    }

    // 1) 抽象产品角色:定义具体产品角色要实现的接口。可以用一个接口或者抽象类实现。
    public abstract class Car
    {
        public abstract void Start();
        public abstract void Run();
        public abstract void Stop();
    }

    // 2) 具体产品角色:实现抽象产品角色所定义的接口。
    public class Benz : Car
    {
        public override void Start()
        {
            Console.WriteLine("The Benz Car Start.");
        }

        public override void Run()
        {
            Console.WriteLine("The Benz Car Running.");
        }

        public override void Stop()
        {
            Console.WriteLine("The Benz Car Stop.");
        }
    }

    public class BWM : Car
    {
        public override void Start()
        {
            Console.WriteLine("The BWM Car Start.");
        }

        public override void Run()
        {
            Console.WriteLine("The BWM Car Running.");
        }

        public override void Stop()
        {
            Console.WriteLine("The BWM Car Stop.");
        }
    }

    // 3) 工厂角色:该角色是简单工厂模式的核心。通常根据参数创建一个具体产品的实例。
    public class CarFactory
    {
        public static Car GetCar(string carType)
        {
            if (carType == "Benz")
            {
                return new Benz();
            }
            else if (carType == "BWM")
            {
                return new BWM();
            }
            else
            {
                return null;
            }
        }
    }
}

使用反射

using System;


namespace Pattern.SimpleFactory
{
    public class Test
    {
        public static void Main()
        {
            Car car;

            Label_001:
            Console.Write("请输入车名:");
            string carType = Console.ReadLine();

            car = CarFactory.GetCar(carType); // 返回车的实例。
            if (car == null)
            {
                Console.Write("可能没有这辆车。");
                Console.WriteLine();
                goto Label_001;
            }

            car.Start();
            car.Run();
            car.Stop();
            Console.WriteLine();

            goto Label_001;
        }
    }
}

using System;
using System.Reflection;


namespace Pattern.SimpleFactory
{
    public abstract class Car
    {
        public abstract void Start();
        public abstract void Run();
        public abstract void Stop();
    }

     public class Benz : Car
    {
        public override void Start()
        {
            Console.WriteLine("The Benz Car Start.");
        }

        public override void Run()
        {
            Console.WriteLine("The Benz Car Running.");
        }

        public override void Stop()
        {
            Console.WriteLine("The Benz Car Stop.");
        }
    }

    public class BWM : Car
    {
        public override void Start()
        {
            Console.WriteLine("The BWM Car Start.");
        }

        public override void Run()
        {
            Console.WriteLine("The BWM Car Running.");
        }

        public override void Stop()
        {
            Console.WriteLine("The BWM Car Stop.");
        }
    }

    public class CarFactory
    {
        public static Car GetCar(string carType)
        {
            Car car;
            try
            {
                // 根据参数确定类名,再创建类的实例,要指定,类所在的.dll文件名和完整的类名(含名字空间)
                car = (Car)Assembly.Load("DLL").CreateInstance("Pattern.SimpleFactory." + carType);
            }
            catch
            {
                car = null;
            }

            return car;
        }
    }
}


总结(2008-6-13)
如果具体产品角色要增加就修改工厂角色类。不过通 Assembly 类可以不修改工厂角色类。

标签:设计模式 
返回摘要 | 分类(C#/CSharp) | 访问(89) | 编辑