设计模式 第一回 工厂模型

简单工厂模式

 定义:

专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。

意图:

提供一个类,由它负责根据一定的条件创建某一具体类的实例

参与者:

工厂角色:creater

产品角色:product 产品的抽象。所有产品的父类,描述所有具体产品公用的接口

具体产品:concrete product

实例:
 

 

using  System;
using  System.Text;

namespace  simpleFactory
{
    
///   <summary>
    
///  requirment:print paper according different type,including email print,document print.factory:printer,product:paper
    
///   </summary>
     public   interface  Iprint
    {
        
void  GetPaper();
    }
    
public   class  EmailPaper : Iprint
    {
        
public   void  GetPaper()
        {
            Console.WriteLine(
" this is email paper " );
        }
    }
    
public   class  DocumentPaper : Iprint
    {
        
public   void  GetPaper()
        {
            Console.WriteLine(
" this is document paper " );
        }
    }

    
public   class  Printer
    {
        
public  Iprint CreatePaper(PaperType type)
        {
            
switch  (type)
            {
                
case  PaperType.DocumentPaper:
                    
return   new  DocumentPaper();
                
case  PaperType.EmailPaper:
                    
return   new  EmailPaper();
                
default :
                    
throw   new  Exception( " not implement " );
            }
        }
    }
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            Iprint paper;
            Printer printer 
=   new  Printer();
            Console.WriteLine(
" get email paper " );
            paper 
=  printer.CreatePaper(PaperType.EmailPaper);
            paper.GetPaper();
            Console.ReadLine();

        }
    }

    
public   enum  PaperType
    {
        DocumentPaper,
        EmailPaper
    }
}


工厂方法:再简单工厂模式的基础上,如果我们不能清晰的明确具体工厂类,为了应对更多可能出现的具体工厂类的产生,需要将具体工厂类进行再次封装。

定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成, 即由子类来决定究竟应该实例化(创建)哪一个类。

意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。 

 

 参与者:

 抽象产品角色(Product)定义产品的接口

具体产品角色(ConcreteProduct) 实现接口Product的具体产品类

抽象工厂角色(Creator)  

声明工厂方法(FactoryMethod),返回一个产品  

真实的工厂(ConcreteCreator) 实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例

 

应用情景:

  • 类不知道自己要创建哪一个对象时
  • 类用它的子类来指定创建哪个对象
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候

 

实例:

using  System;
using  System.Reflection;

namespace  FactoryMethod
{
    
///   <summary>
    
///  requirment:print paper according different type,including email print,document print.factory:printer,product:paper
    
///   </summary>

    
#region  product
    
public   interface  Iprint
    {
        
void  GetPaper();
    }
    
#endregion

    
#region  factory Function
    
public   interface  Ifactory
    {
        Iprint CreatePrinter();
    }
    
#endregion

    
#region  concreate factory
    
public   class  EmailFactory : Ifactory
    {
        
public  Iprint CreatePrinter()
        {
            
return   new  EmailPaper();
        }

    }

    
public   class  DocumentFactory : Ifactory
    {
        
public  Iprint CreatePrinter()
        {
            
return   new  DocumentPaper();
        }

    }
    
#endregion

    
#region  concrete product
    
public   class  EmailPaper : Iprint
    {
        
public   void  GetPaper()
        {
            Console.WriteLine(
" this is email paper " );
        }
    }
    
public   class  DocumentPaper : Iprint
    {
        
public   void  GetPaper()
        {
            Console.WriteLine(
" this is document paper " );
        }
    }
    
#endregion

   
    
class  Client
    {
        
static   void  Main( string [] args)
        {
            Console.WriteLine(
" get email paper " );
            Ifactory printer 
=  (Ifactory)Assembly.Load( " FactoryMethod " ).CreateInstance( " FactoryMethod.EmailFactory " );

            printer.CreatePrinter().GetPaper();
            Console.ReadLine();

        }
    }
}



 

缺点:

  • 在添加新产品时,需要编写新的具体产品类(其实这不算一个缺点,因为这是不可避免的),要增加与之对应的具体工厂类。

 


抽象工厂模式:

Abstract Factory模式中,跟客户打交道的只有抽象工厂与抽象产品,客户不需要知道产品由哪个工厂生产,也不需要知道被生产的是哪一种具体的产品。  

Abstract Factory模式通过抽象工厂为客户(调用者)生成多类产品,抽象工厂负责管理子工厂对象,子工厂负责生成某一类具体的产品对象。

Abstract Factory模式的应用场景:
- 存在多类产品,并需要对这些产品区别对待处理:需要分别为这些产品定义2个以上的接口或抽象类
- 客户端只需要与最上层的工厂(抽象工厂),与最上层的抽象产品打交道 

 

意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

参考者:
也就是该模式中的各个类或对象之间的关系:

  • 抽象工厂(Abstract Factory)
    声明生成一系列抽象产品的方法
  • 具体工厂(Concrete Factory)
    执行生成一系列抽象产品的方法,生成一系列具体的产品
  • 抽象产品(Abstract Product)
    为这一系列的某一种产品声明接口
  • 具体产品(Product)
    定义具体工厂生成的具体产品的对象,实现产品接口
 
ExpandedBlockStart.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  AbstractFactory
{
    
public   abstract   class  CarFactory
    {
       
        
public   abstract  AbstractBus CreateBus();
        
public   abstract  AbstractTruck CreateTruck();
        
public   static  CarFactory GetCarFactory( int  carType)
        {
            
switch  (carType)
            {
                
case   1 :
                    
return   new  BusTruckFactory();
                
case   2 :
                    
return   new  ModelFactory();
                
default return   null ;

            }
        }
    }

    
public   class  BusTruckFactory : CarFactory
    {
        
public   override  AbstractBus CreateBus()
        {
            
return   new  Bus();
        }
        
public   override  AbstractTruck CreateTruck()
        {
            
return   new  Truck();
        }

    }

    
public   class  ModelFactory : CarFactory
    {
        
public   override  AbstractBus CreateBus()
        {
            
return   new  ModelBus();
        }
        
public   override  AbstractTruck CreateTruck()
        {
            
return   new  ModelTruck();
        }
    }

    
public   class  AbstractBus
    {
        
public   string  getType()
        {
            
return   " AbstractBus " ;
        }
    }
    
public   class  Bus : AbstractBus
    {
        
public   string  getType()
        {
            
return   " Bus " ;
        }
    }
    
public   class  ModelBus : AbstractBus
    {
        
public   string  getType()
        {
            
return   " ModelBus " ;
        }
    }
    
public   class  AbstractTruck
    {
        
public   string  getType()
        {
            
return   " AbstractTruck " ;
        }
    }
    
public   class  Truck :AbstractTruck
    {
          
public   string  getType()
        {
            
return   " Truck " ;
        }
    }
    
public   class  ModelTruck : AbstractTruck
    {
        
public   string  getType()
        {
            
return   " Model Truck " ;
        }
    }
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            CarFactory factory 
=  CarFactory.GetCarFactory( 1 );
            Bus bus
= (Bus)factory .CreateBus ();
            Console .WriteLine (
" create: "   + bus.getType ());
            Truck truck
= (Truck )factory .CreateTruck ();
            Console .WriteLine (
" create: "   + truck.getType ());


               factory
= CarFactory .GetCarFactory ( 2 );
               ModelBus modelbus 
=  (ModelBus)factory.CreateBus();
               Console.WriteLine(
" create: "   +  modelbus.getType());
            ModelTruck modelTruck
=  (ModelTruck)factory.CreateTruck();
            Console.WriteLine(
" create: "   +  modelTruck.getType());
            Console.ReadLine();
        }
    }
}


 



 

 

转载于:https://www.cnblogs.com/JessieDong/archive/2009/12/03/1611492.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值