工厂模式之三 - 抽象工厂(Abstract Factory)模式

抽象工厂(Abstract Factory)模式 不同于简单工厂和工厂方法,抽象工厂用于创建一个产品族

即抽象工厂模式用于创建一系列类,这些类在业务上有关联。

我们来举个快餐店的例子。

场景:快餐店的套餐分为汉堡和饮料,汉堡可以选鸡肉汉堡,鱼肉汉堡,巨无霸等等,

         饮料可以选咖啡,可乐,橙汁等等。

 

对于业务来说,汉堡和饮料分别可以被抽象为两类产品,因此,我们可以建立2个接口。

汉堡可以有2个方法,一个是打印汉堡名,一个是打印价钱,如下:

namespace  designpattern.cs.AbstracFactory
{
    
public   interface  IHamburger
    {
        
void  printName();
        
void  printCost();
    }
}

 

 饮料接口除了汉堡该有的方法外,由于我们可以选热饮或冷饮,热饮像咖啡我们可以加糖,或者冷饮我们可以加冰块。

所以,饮料接口必须有另外一个方法叫putAddition,如下:

namespace  designpattern.cs.AbstracFactory
{
    
public   interface  IDrink
    {
        
void  printName();
        
void  printCost();
        
void  putAddition();
    }
}

 

接下来,我们便可以设计汉堡和饮料的系列产品了。

汉堡类产品如下:

 

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  FishHamburger:IHamburger
    {
        
public   void  printName()
        {
            Console.Write(
" Fish Hamburger :  " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
" $1.5 " );
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  ChickenHamburger : IHamburger
    {
        
public   void  printName()
        {
            Console.Write(
" Chicken Hamburger :  " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
" $1.8 " );
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  SuperHamburger : IHamburger
    {
        
public   void  printName()
        {
            Console.Write(
" Super Hamburger :  " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
" $2 " );
        }
    }
}

 

饮料类产品如下:

我们可以创建有糖或者无糖的咖啡,也可以创建加冰块或者不加冰块的可乐。

 

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  CoffeeWithoutSugar:IDrink
    {
        
public   void  printName()
        {
            Console.Write(
" Coffee " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
"   $0.9 " );
        }

        
public   void  putAddition()
        {
            Console.Write(
"  Without Sugar " );
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  CoffeeWithSugar:IDrink
    {
        
public   void  printName()
        {
            Console.Write(
" Coffee " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
"   $1 " );
        }

        
public   void  putAddition()
        {
            Console.Write(
"  With Sugar " );
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  CokeWithIce:IDrink
    {
        
public   void  printName()
        {
            Console.Write(
" Coke " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
"   $0.8 " );
        }

        
public   void  putAddition()
        {
            Console.Write(
"  With Ice " );
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  CokeWithoutIce:IDrink
    {
        
public   void  printName()
        {
            Console.Write(
" Coke " );
        }

        
public   void  printCost()
        {
            Console.WriteLine(
"   $0.8 " );
        }

        
public   void  putAddition()
        {
            Console.Write(
"  Without Ice " );
        }
    }
}

 

有了产品系列以后,我们可以构造一个抽象工厂接口,用于创建我们的订单,如下:

 

namespace  designpattern.cs.AbstracFactory
{
    
public   interface  OrderFactory
    {
        IHamburger createHamburger();
        IDrink createDrink();
    }
}

 

接下来,我们可以建立实体工厂类了,订单可能是各种可能的排列组合:

 

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  OrderA:IOrderFactory
    {
        
public  IHamburger createHamburger()
        {
            
return   new  ChickenHamburger();
        }

        
public  IDrink createDrink()
        {
            
return   new  CokeWithIce();
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  OrderB:IOrderFactory
    {
        
public  IHamburger createHamburger()
        {
            
return   new  FishHamburger();
        }

        
public  IDrink createDrink()
        {
            
return   new  CoffeeWithoutSugar();
        }
    }
}

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  OrderC:IOrderFactory
    {
        
public  IHamburger createHamburger()
        {
            
return   new  SuperHamburger();
        }

        
public  IDrink createDrink()
        {
            
return   new  CoffeeWithSugar();
        }
    }
}

 

 

最后,我们些个客户端,构建2份订单,如下:

 

using  System;

namespace  designpattern.cs.AbstracFactory
{
    
public   class  ClientDemo1
    {
        
static   void  Main( string [] args)
        {
            
// Order A
            IHamburger food1;
            IDrink drink1;
            IOrderFactory orderA 
=   new  OrderA();
            food1 
=  orderA.createHamburger();
            drink1 
=  orderA.createDrink();
            Console.WriteLine(
" Your Order List: " );
            Console.WriteLine(
" ------------------------------------------------ " );
            food1.printName();
            food1.printCost();
            drink1.printName();
            drink1.putAddition();
            drink1.printCost();
            Console.WriteLine(
" ------------------------------------------------ " );

            
// Order C
            IHamburger food2;
            IDrink drink2;
            IOrderFactory orderC 
=   new  OrderC();
            food2 
=  orderC.createHamburger();
            drink2 
=  orderC.createDrink();
            Console.WriteLine(
" Your Order List: " );
            Console.WriteLine(
" ------------------------------------------------ " );
            food2.printName();
            food2.printCost();
            drink2.printName();
            drink2.putAddition();
            drink2.printCost();
            Console.WriteLine(
" ------------------------------------------------ " );

            Console.ReadLine();
        }
    }
}

 

运行结果如下:

Your Order List:
------------------------------------------------
Chicken Hamburger  $1.8
Coke With Ice  $0.8
------------------------------------------------
Your Order List:
------------------------------------------------
Super Hamburger  $2
Coffee With Sugar  $1
------------------------------------------------

 

 

转载于:https://www.cnblogs.com/davidgu/archive/2009/06/27/1512405.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值