代码改变世界

ASP.NET 工厂模式

2010-02-06 01:27  eng308  阅读(3455)  评论(0编辑  收藏  举报
一、引子
           话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi后他说“开奥迪车!”。
           你一定说:这人有病!直接说开车不就行了?!
           而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!
           幸运的是,这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!!
    二、简介
           工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
                   1. 简单工厂模式(Simple Factory)                
                   2. 工厂方法模式(Factory Method)
                   3. 抽象工厂模式(Abstract Factory)
           这三种模式从上到下逐步抽象,并且更具一般性。
           还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可,这本为使用《Java与模式》的分类方法。
           在什么样的情况下我们应该记得使用工厂模式呢?大体有两点:
                   1.在编码时不能预见需要创建哪种类的实例。
               2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
         ....................................
四、工厂方法模式
           先来看下它的组成吧:
                       抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
                       具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
                       抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
                       具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
public abstract class car       //抽象产品
       {
           public abstract void     Drive();
       }
       public class bens : car //具体产品1
       {
           public override void Drive()
           {
               throw new Exception("The method or operation is not implemented.");
           }
    
       }
       public class bmw : car     //具体产品2
       {
           public override void Drive()
           {
               throw new Exception("The method or operation is not implemented.");
           }
       }
       public abstract class driver     //抽象工厂
       {
         public abstract     car divercar();  
       }
       public class benzdriver : driver //具体工厂1
       {
           public override car divercar()
           {
               return new bens();
           }
    
       }
       public class bmwdriver : driver //具体工厂2
       {
           public override car divercar()
           {
               return new bmw();
           }
       }
       public class test  
     {
           public static void main()
           {
               driver dri = new benzdriver();
               car ca = dri.divercar();
               ca.Drive();        
        
           }