欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
工廠(chǎng)方法模式(Factory Method Pattern)

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

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

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

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

在Factory Method模式中,工廠(chǎng)類(lèi)與產(chǎn)品類(lèi)往往具有平行的等級結構,它們之間一一對應。


二、 Factory Method模式角色與結構:

 

抽象工廠(chǎng)(Creator)角色:是工廠(chǎng)方法模式的核心,與應用程序無(wú)關(guān)。任何在模式中創(chuàng )建的對象的工廠(chǎng)類(lèi)必須實(shí)現這個(gè)接口。

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

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

具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專(zhuān)門(mén)的具體工廠(chǎng)創(chuà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();
   }

}

 

工廠(chǎng)方法的活動(dòng)序列圖

 

活動(dòng)過(guò)程包括:

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


四、 工廠(chǎng)方法模式與簡(jiǎn)單工廠(chǎng)模式

工廠(chǎng)方法模式與簡(jiǎn)單工廠(chǎng)模式再結構上的不同不是很明顯。工廠(chǎng)方法類(lèi)的核心是一個(gè)抽象工廠(chǎng)類(lèi),而簡(jiǎn)單工廠(chǎng)模式把核心放在一個(gè)具體類(lèi)上。

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

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

工廠(chǎng)方法模式退化后可以演變成簡(jiǎn)單工廠(chǎng)模式。


五、 Factory Method模式演化

使用接口或抽象類(lèi)
抽象工廠(chǎng)角色和抽象場(chǎng)頻角色都可以選擇由接口或抽象類(lèi)實(shí)現。

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

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

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

 

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

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

工廠(chǎng)的等級結構:工廠(chǎng)對象應當有一個(gè)抽象的超類(lèi)型。如果等級結構中只有一個(gè)具體工廠(chǎng)類(lèi)的話(huà),抽象工廠(chǎng)就可以省略,發(fā)生了退化。


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

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


七、 另外一個(gè)例子

 

// 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ù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
工廠(chǎng)模式
Java 之工廠(chǎng)方法和抽象工廠(chǎng)模式
工廠(chǎng)方法模式(Factory method)以及與抽象工廠(chǎng)(abstract factor...
【設計模式】工廠(chǎng)方法模式(Factory Method)
設計模式 (2)
創(chuàng )建型模式之工廠(chǎng)方法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久