面向对象设计模式之FactoryMethod工厂方法模式(创建型)

动机:当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个, 并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

意图:定义一个用于创建对象的接口,让子类决定实例化 哪个子类。FactoryMethod使得一个类的实例化延迟到子类

UML图:

示例代码:演示说明 ,一个汽车测试软件系统 FactoryMethod的应用

    

  public enum Direction
    { 
      Right,Left
    }



    public abstract class AbstractCar
    {
        //启动
        public abstract void Startup();

        //行驶
        public abstract void Run();

        //转向
        public abstract void Turn(Direction dire);


        //鸣笛
        public abstract void Deep();
        //刹车
        public abstract void Stop();

    }

    /// <summary>
    /// 汽车工厂(抽象层)
    /// </summary>
    public abstract class CarFactory
    {
        public abstract AbstractCar CreateCar();

    }



    public class CarTestFramework
    {
        AbstractCar car;
        public void BuildTestContext(CarFactory carfactory)
        {
            car = carfactory.CreateCar();
        }

        public void TestRun() { car.Run(); }
        public void TestTurn(Direction d) { car.Turn(d); }
        public void TestDeep() { car.Deep(); }
        public void TestStop() { car.Stop(); }

    }

客户程序调用:

class AppClient    {
        static void Main(string[] args)
        {
            //从配置文件中动态加载具体汽车生产工厂的dll,保证了客户代码的稳定性;即当你的应用程序
            //版本升级时,你只需要将改变的dll给用户,或者再修改一下配置文件即可扩展此程序
            string assemblyName = ConfigurationManager.AppSettings["CarFactoryAssembly"];
            string factoryName = ConfigurationManager.AppSettings["CarFactoryName"];
            Assembly factoryAssembly = Assembly.Load(assemblyName);
            Type factoryType = factoryAssembly.GetType(factoryName);
            CarTestFramework carTest = new CarTestFramework();
            //carTest.BuildTestContext(new DaZhongFactory());
            carTest.BuildTestContext((DaZhongFactory)Activator.CreateInstance(factoryType));
            carTest.TestRun();
            carTest.TestStop();
            carTest.TestTurn(Direction.Right);
        }
    }

注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考

 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值