小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

工廠方法模式(Factory Method Pattern)

 漂在北方的狼 2007-03-28

一、 工廠方法(Factory Method)模式

工廠方法(FactoryMethod)模式是類的創(chuàng)建模式,其用意是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類中。

工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點。

在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實現(xiàn)的接口,而不接觸哪一個產(chǎn)品類被實例化這種細(xì)節(jié)。這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。

在Factory Method模式中,工廠類與產(chǎn)品類往往具有平行的等級結(jié)構(gòu),它們之間一一對應(yīng)。


二、 Factory Method模式角色與結(jié)構(gòu):

 

抽象工廠(Creator)角色:是工廠方法模式的核心,與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建的對象的工廠類必須實現(xiàn)這個接口。

具體工廠(Concrete Creator)角色:這是實現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。

抽象產(chǎn)品(Product)角色:工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。

具體產(chǎn)品(Concrete Product)角色:這個角色實現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng)。


三、 程序舉例:

 

using System;

public abstract   class Light
{
   
public abstract void TurnOn();
   
public abstract void TurnOff();
}


public class BulbLight : Light
{
   
public override void TurnOn()
   
{ Console.WriteLine("Bulb Light is Turned on"); }

   
public override void TurnOff()
   
{ Console.WriteLine("Bulb Light is Turned off"); }
}


public class TubeLight : Light
{
   
public override void TurnOn()
   
{ Console.WriteLine("Tube Light is Turned on"); }

   
public override void TurnOff()
   
{ Console.WriteLine("Tube Light is Turned off"); }
}


public abstract   class Creator
{
   
public abstract Light factory();
}


public class BulbCreator : Creator
{
   
public override Light factory()
   
return new BulbLight(); }
}


public class TubeCreator : Creator
{
   
public override Light factory()
   
return new TubeLight(); }
}


public class Client
{
   
public static void Main()
   
{
      Creator c1 
= new BulbCreator();
      Creator c2 
= new TubeCreator();

      Light l1 
= c1.factory();
      Light l2 
= c2.factory();

      l1.TurnOn();
      l1.TurnOff();

      Console.WriteLine(
"-----------------");

      l2.TurnOn();
      l2.TurnOff();
   }

}

 

工廠方法的活動序列圖

 

活動過程包括:

客戶端創(chuàng)建BulbCreator對象,客戶端持有此對象的類型是Creator,而實際類型是BulbCreator。然后客戶端調(diào)用 BulbCreator的factory方法,之后BulbCreator調(diào)用BulbLight的構(gòu)造函數(shù)創(chuàng)造出產(chǎn)品BulbLight對象。


四、 工廠方法模式與簡單工廠模式

工廠方法模式與簡單工廠模式再結(jié)構(gòu)上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。

工廠方法模式之所以有一個別名叫多態(tài)性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。

當(dāng)系統(tǒng)擴展需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴展性不好。

工廠方法模式退化后可以演變成簡單工廠模式。


五、 Factory Method模式演化

使用接口或抽象類
抽象工廠角色和抽象場頻角色都可以選擇由接口或抽象類實現(xiàn)。

使用多個工廠方法
抽象工廠角色可以規(guī)定出多于一個的工廠方法,從而使具體工廠角色實現(xiàn)這些不同的工廠方法,這些方法可以提供不同的商業(yè)邏輯,以滿足提供不同的產(chǎn)品對象的任務(wù)。

產(chǎn)品的循環(huán)使用
工廠方法總是調(diào)用產(chǎn)品類的構(gòu)造函數(shù)以創(chuàng)建一個新的產(chǎn)品實例,然后將這個實例提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當(dāng)復(fù)雜。

一個常見的復(fù)雜邏輯就是循環(huán)使用產(chǎn)品對象。工廠對象將已經(jīng)創(chuàng)建過的產(chǎn)品登記到一個聚集中,然后根據(jù)客戶所請求的產(chǎn)品狀態(tài),向聚集查詢。如果有滿足要 求的產(chǎn)品對象,就直接將產(chǎn)品返回客戶端;如果聚集中沒有這樣的產(chǎn)品對象,那么就創(chuàng)建一個新的滿足要求的產(chǎn)品對象,然后將這個對象登記到聚集中,再返還給客 戶端。"享元模式(Flyweight Pattern)"就是這樣一個模式。

 

多態(tài)性的喪失和模式的退化
一個工廠方法模式的實現(xiàn)依賴于工廠角色和產(chǎn)品角色的多態(tài)性。在有些情況下,這個模式可以出現(xiàn)退化。

工廠方法返回的類型應(yīng)當(dāng)是抽象類型,而不是具體類型。調(diào)用工廠方法的客戶端應(yīng)當(dāng)依賴抽象產(chǎn)品編程,而不是具體產(chǎn)品。如果工廠僅僅返回一個具體產(chǎn)品對象,便違背了工廠方法的用意,發(fā)生退化,這時就不再是工廠模式了。

工廠的等級結(jié)構(gòu):工廠對象應(yīng)當(dāng)有一個抽象的超類型。如果等級結(jié)構(gòu)中只有一個具體工廠類的話,抽象工廠就可以省略,發(fā)生了退化。


六、 Factory Method模式與其它模式的關(guān)系

與工廠方法模式有關(guān)的模式還包括:
模板方法模式、MVC模式、享元模式、備忘錄模式


七、 另外一個例子

 

// Factory Method pattern -- Real World example  

using System;
using System.Collections;

// "Product"
abstract class Page
{
}


// "ConcreteProduct"
class SkillsPage : Page
{
}


// "ConcreteProduct"
class EducationPage : Page
{
}


// "ConcreteProduct"
class ExperiencePage : Page
{
}


// "ConcreteProduct"
class IntroductionPage : Page
{
}


// "ConcreteProduct"
class ResultsPage : Page
{
}


// "ConcreteProduct"
class ConclusionPage : Page
{
}


// "ConcreteProduct"
class SummaryPage : Page
{
}


// "ConcreteProduct"
class BibliographyPage : Page
{
}


// "Creator"
abstract class Document
{
  
// Fields
   protected ArrayList pages = new ArrayList();

  
// Constructor
   public Document()
  
{
    
this.CreatePages();
  }


  
// Properties
   public ArrayList Pages
  
{
    
getreturn pages; }
  }


  
// Factory Method
   abstract public void CreatePages();
}


// "ConcreteCreator"
class Resume : Document
{
  
// Factory Method implementation
   override public void CreatePages()
  
{
    pages.Add( 
new SkillsPage() );
    pages.Add( 
new EducationPage() );
    pages.Add( 
new ExperiencePage() );
  }

}


// "ConcreteCreator"
class Report : Document
{
  
// Factory Method implementation
   override public void CreatePages()
  
{
    pages.Add( 
new IntroductionPage() );
    pages.Add( 
new ResultsPage() );
    pages.Add( 
new ConclusionPage() );
    pages.Add( 
new SummaryPage() );
    pages.Add( 
new BibliographyPage() );
  }

}


/// <summary>
///  FactoryMethodApp test
/// </summary>

class FactoryMethodApp
{
  
public static void Main( string[] args )
  
{
    Document[] docs 
= new Document[ 2 ];

    
// Note: constructors call Factory Method
    docs[0= new Resume();
    docs[
1= new Report();

    
// Display document pages
     foreach( Document document in docs )
    
{
      Console.WriteLine( 
" " + document + " ------- " );
      
foreach( Page page in document.Pages )
        Console.WriteLine( 
" " + page );
    }

  }

}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多