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

    先把自己学到贴出来,然后再根据参考别人的,再写出自己的感悟。

    首先按照惯例先贴出UML:

    从这个UML中我们可以看出有两个继承关系,还有一个组合关系,这个组合关系应用的很巧妙。

    下面一个汽车生产过程的工厂模式:

       abstract class CarAbstract{
            public abstract void StartUp();
            public abstract void Stop();
            public abstract void Turn();
            public abstract void Run();
        }
    

    这个抽象类定义了车队基本操作,如转弯。

    那么他的相应的ConcreteProduct呢?

        class DongfengCar:CarAbstract
        {
            public override void Run()
            {
                throw new NotImplementedException();
            }
            public override void StartUp()
            {
                throw new NotImplementedException();
            }
    
            public override void Stop()
            {
                throw new NotImplementedException();
            }
            public override void Turn()
            {
                throw new NotImplementedException();
            }
        }
    

     但是如果才能实例化一个Car?

     abstract class CarFactory
        {
            public abstract CarAbstract CreateCar();
        }
    

    最后就是实现ContreteCreator了:

    class DongfengFactory:CarFactory
        {
            public override CarAbstract CreateCar()
            {
                //.....
                return new DongfengCar();
                //throw new NotImplementedException();
            }
        }
    

    客服端要调用哪个可以利用.Net的反射机制,用反射机制也是考虑到有多种不同类型的车,比如奔驰车等。

    刚刚上面那个程序是自己根据UML后推导的,这样明显不合实际。

    那么现在来看下:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 这篇文章的吧。这边文章的确不错,这才是正常的思维。

    那么我遇到的最大问题之一是:

    不知道是不是太困了看傻了,这次(第二次看到这篇文章)看时竟然有点不理解了:
    EventLog eventlog = new EventLog();
    eventlog.Write();

    这里通过基类来调用:
    Log log = new EventLog();
    log.Write();

    这样的话和:
    LogFactory factory = new EventFactory();
    Log log = factory.Create();
    log.Write();

    相比会差很多?感觉其实是一样的啊?

    刚开始我也想不通,不知道为什么?楼主回答是:

    感觉怎么会一样呢,现在已经脱离了对EventLog的依赖,注意,EventLog在这个示例中属于容易变化的部分,我们要做的是尽量依赖于稳定不变的部分。

    后面想下,我们的 EventFactory();只是传递EventLog()的实例,他是稳定不变的,这样我们就做到了依赖于稳定对象了。

    待续

    还记得petshop的抽象工厂模式:

    他的SQLServerDAL空间下单所有类都是继承IDAL的,如果跟第一个UML匹配的话,那么就是Product与ContrateProduct的关系了,那么DALFactory调用实例化就像上面讨论的了:

    LogFactory factory = new EventFactory();
    Log log = factory.Create();
    log.Write();

    他没有很规范的用了工厂模式,但是它就是工厂模式。我想下,应该是因为SQLServerDAL的类变化比较小的缘故。太经典。

  • 相关阅读:
    数据库添加字段的默认值
    Map中存放数组
    JSON字符串转换为Map
    java中Object转换成int或String类型方法
    Max_connect_errors – MySQL性能参数详解
    查看已经安装的软件
    eclipse远程调试tomcat
    eclipse控制台不限制显示的行数
    栈和堆(Stack && Heap)
    一道题引发的self和super
  • 原文地址:https://www.cnblogs.com/huaizuo/p/2680983.html
Copyright © 2011-2022 走看看