温习C#设计模式之(二) 工厂方法模式(Factory Method)

来源:互联网 发布:万能五笔mac版 编辑:程序博客网 时间:2024/06/01 08:18

由于时间关系好几天没有更新博客了,我的温习工作也样停在第一章。今天忙里偷闲,继续我的温习。今天我来看工厂方法模式 (Factory Method)。

一、概念

       在简单工厂模式中,对象的创建是在一专职的工厂类(Factory)中实现的,这个工厂类用来专门负责实例化哪一个子类。当需要增加新的子类时,必需修改这个工厂类。而当基类在某种情况下还没有能力知道应该创建哪一个子类的实例是,简单工厂就不能改满足要求。从而促使了工厂方法模式的行成,工厂方法模式是对简单工厂模式的扩展。其用意为定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

二、工厂方法模式角色与结构关系

抽象工厂(Factory)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口(与简单工厂模式的工厂处于同等角色位置)。

具体工厂(Concrete Factory)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbFactory与TubeFactory。

抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。

具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

关系如图:

从结构图可以看出,工厂方法模式有两套继承体系,工厂继承体系与产品继承体系,且上面的结构图所表示出的工厂与产品是平行、对应的关系,这是通常的情况,实际应用中可能会有多个工厂对应一个产品或相反的情况,也就是这种平行不是绝对的。

三、举例

    /// <summary>
    
///灯,抽象基类
    
/// </summary>
    public abstract class Light
    {
        
public virtual void TurnOn()
        {
            
//do something
        }
        
public virtual void TurnOff()
        {
            
//do something
        }
    }
    
/// <summary>
    
/// 球型灯子类
    
/// </summary>
    public class BulbLight:Light
    {
    }
    
/// <summary>
    
/// 管型灯子类
    
/// </summary>
    public class TubeLight : Light
    { 
    }

    
/// <summary>
    
/// 工厂类,抽象基类
    
/// </summary>
    public abstract class Factory
    {
        
public abstract Light Create();
    }
    
/// <summary>
    
/// 具体工厂类,BulbFactory用于产生BulbLight实例 
    
/// </summary>
    public class BulbFactory : Factory
    {
        
public override Light Create()
        {
            
return new BulbLight();
        }
    }
    
/// <summary>
    
/// 具体工厂类,TubeLight用于产生TubeLight实例
    
/// </summary>
    public class TubeFactory : Factory
    {
        
public override Light Create()
        {
            
return new TubeLight();
        }
    }

 四、使用场合

在下列情况下,应该考虑使用工厂方法:

  • 一个类无法预测它要创建的对象属于哪一个类。
  • 一个类用它的子类来指定所创建的对象。
  • 把要创建哪一个类的信息局部化时候。

对象实行工厂模式,还需考虑几个问题:

  • 基类是一个抽象类,模式必须返回一个完整的可工作的类。
  • 基类包含默认方法,除非默认方法不能胜任,才会调用这些方法。
  • 可以将参数传给工厂,告诉工厂返回哪一个类型的类。种情况,类可以共享相同的方法名,但完成的工作可以不同。
原创粉丝点击