工厂模式

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

首先按照惯例先贴出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的类变化比较小的缘故。太经典。

posted @   小霖2012  阅读(385)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示