博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

設計模式(3):抽象工廠模式(Abstract Factory Pattern)

Posted on 2006-05-29 15:32  donald  阅读(301)  评论(0)    收藏  举报
意图

提供一个创建一系列相关和相互依赖对象的借口, 而无须指定它们具体的类

结构和角色

抽象工厂角色(厨师): 声明一个创建抽象产品对象的操作接口
具体工厂角色(川/湘系厨师): 实现创建具体产品对象的操作
抽象产品角色(水煮鱼,红烧肉): 为一类产品声明一个接口
具体产品角色: 定义一个将被相应的具体工厂创建的对象


解说
/// <summary>
/// 抽象工廠類
/// </summary>

public abstract class 廚師
{
   
public abstract 水煮魚 CreateFish();
   
   
public abstract 紅燒肉 CreateMeat();

}



/// <summary>
/// 具體工廠類
/// </summary>

public class 湘系廚師 : 廚師
{
    
public override 紅燒肉 CreateMeat)
    
{
        
return new 湘系紅燒肉();
    }


    
public override 水煮魚 CreateFish()
    
{
        
return new 湘系水煮魚();  
    }

}



/// <summary>
/// 具體工廠類
/// </summary>

public class 川系廚師 : 廚師
{
    
public override 紅燒肉 CreateMeat()
    
{
        
return new 川系紅燒肉();
    }


    
public override 水煮魚 CreateFish()
    
{
        
return new 川系水煮魚();  
    }



}


/// <summary>
/// 抽象產品類
/// </summary>

public abstract class 水煮魚
{
    
///<summary>
    
/// 可製作, 可烹飪
    
/// </summary>

    public abstract void  Cook();

    
/// <summary>
    
/// 味道
    
/// </summary>

    public abstract string Taste{get;}

}


/// <summary>
/// 抽象產品類
/// </summary>

public abstract class 紅燒肉
{
    
///<summary>
    
/// 可製作, 可烹飪
    
/// </summary>

    public abstract void Cook();

    
/// <summary>
    
/// 味道
    
/// </summary>

    public abstract string Taste{get;}
}


/// <summary>
/// 具體產品類
/// </summary>

public class 川系水煮魚 : 水煮魚
{
    
public override void Cook()
    
{
        
//燒的步驟,方法
        Console.WriteLine("先調料, 然後炒肉");
    }


    
public override string Taste
    
{
        
get
        
{
            
return "辛辣,可口";
        }

    }

}


/// <summary>
/// 具體產品類
/// </summary>

public class 川系紅燒肉 : 紅燒肉
{
    
public override void Cook()
    
{
        
//燒的步驟,方法
        Console.WriteLine("先調料, 然後炒肉");
    }


    
public override string Taste
    
{
        
get
        
{
            
return "辛辣,可口";
        }

    }

}



/// <summary>
/// 具體產品類
/// </summary>

public class 湘系水煮魚 : 水煮魚
{
    
public override void Cook()
    
{
        
//燒的步驟,方法
        Console.WriteLine("先調料, 然後炒肉");
    }


    
public override string Taste
    
{
        
get
        
{
            
return "辛辣,可口";
        }

    }

}



/// <summary>
/// 具體產品類
/// </summary>

public class 湘系紅燒肉 : 紅燒肉
{
    
public override void Cook()
    
{
        
//燒的步驟,方法
        Console.WriteLine("先調料, 然後炒肉");
    }


    
public override string Taste
    
{
        
get
        
{
            
return "辛辣,可口";
        }

    }

}
客戶端代碼:
    /// <summary>
    
/// Client 的摘要描述。
    
/// </summary>

    public class Client
    
{
        
public Client()
        
{
            
//
            
// TODO: 在此加入建構函式的程式碼
            
//
        }

        [STAThread]
        
public static void Main(string[] args)
        
{
            廚師 f
=new 湘系廚師();//  new 川系廚師(); 

            水煮魚 fish
=f.CreateFish();
            紅燒肉 meat
=f.CreateMeat();


            fish.Cook();
            Console.WriteLine(fish.Taste);

            meat.Cook();
            Console.WriteLine(meat.Taste);
        }

    }

总结 
抽象工厂模式提供了一个创建一系列相关或相互依赖的对象接口


参考文献:
《设计模式
JAVA与设计模式