<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      前言

        上一篇我們介紹了單例模式,今天給大家講一個(gè)比較簡(jiǎn)單的模式——工廠模式(Factory Method)
      ,工廠模式又是什么呢?顧名思義,工廠——生產(chǎn)制造東西的地方。那么應(yīng)用在程序當(dāng)中該如何使用、并且又起到什么效果呢?以至于為什么用工廠模式呢?


        之前我們說的OCP原則(開放封閉原則),對(duì)擴(kuò)展開放,對(duì)修改封閉這一原則。在工廠模式中有極好的體現(xiàn),對(duì)對(duì)象及類進(jìn)行極好的封裝。使其減少代碼之間的耦合性。更具有擴(kuò)展性。

      工廠模式介紹

      一、來由

        在我們編程過程當(dāng)中,總會(huì)面臨一些類的創(chuàng)建以及對(duì)象的創(chuàng)建,但是由于需求而不斷變動(dòng)(增加或者修改),導(dǎo)致對(duì)象的變化。這時(shí)怎么處理這個(gè)問題呢?

      工廠模式提供的一種封裝機(jī)制,隔離出了那些易變動(dòng)的對(duì)象。這個(gè)時(shí)候需求的變動(dòng)不再影響之前的對(duì)象的變動(dòng)了。

      二、意圖

        定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。FactoryMethod使一個(gè)類的實(shí)例化延遲到其子類。

      三、案例圖

      ?

      ?

      工廠模式中由以下部分組成:

      (1)、抽象工廠(Creator):?復(fù)制定義工廠所需的基本規(guī)則,其他任何具體工廠都得繼承此抽象工廠

      (2)、具體工廠(Concrete_Creator):繼承抽象工廠,實(shí)現(xiàn)其定義的方法,以此來創(chuàng)建具體的產(chǎn)品

      (3)、抽象產(chǎn)品(Product):復(fù)制定義產(chǎn)品的基本方法及規(guī)則,所有具體產(chǎn)品都得基礎(chǔ)此抽象產(chǎn)品類

      (4)、具體產(chǎn)品(Concrete_Product):繼承抽象產(chǎn)品,實(shí)現(xiàn)其定義抽象方法,由具體工廠創(chuàng)建,兩者是一一對(duì)應(yīng)的關(guān)系。

      四、工廠模式代碼實(shí)現(xiàn)

      這里我們通過一個(gè)事例來介紹工廠模式的規(guī)則及用法。在工廠模式中,定義抽象工廠,然后其具體工廠繼承實(shí)現(xiàn)其抽象方法調(diào)用繼承了抽象產(chǎn)品類的具體產(chǎn)品來創(chuàng)建產(chǎn)品。

      ?

      ?

      ?

      下面我們就手機(jī)產(chǎn)品的制造來看看下面的事例吧:
      namespace ConsoleApp4 { public class Factory_Method_Pattern { } #region 產(chǎn)品
      =========================/// <summary> /// 抽象手機(jī)產(chǎn)品類 /// </summary> public
      abstract class Phone { public abstract string Create(); } /// <summary> ///
      具體華為手機(jī)產(chǎn)品類/// </summary> public class Huawei : Phone { /// <summary> /// 實(shí)現(xiàn)抽象方法
      /// </summary> /// <returns></returns> public override string Create() { return
      "華為一號(hào)現(xiàn)世"; } } /// <summary> /// 具體小米手機(jī)產(chǎn)品類 /// </summary> public class Xiaomi :
      Phone {/// <summary> /// 實(shí)現(xiàn)抽象方法 /// </summary> /// <returns></returns> public
      override string Create() { return "小米一號(hào)現(xiàn)世"; } } #endregion #region
      工廠=========================/// <summary> /// 抽象工廠類 /// </summary> public
      abstract class Factory { /// <summary> /// 抽象工廠類的方法,創(chuàng)建調(diào)用產(chǎn)品 /// </summary> ///
      <returns></returns> public abstract Phone CreatePhone(); } /// <summary> ///
      具體華為工廠類,繼承抽象工廠類/// </summary> public class HuaweiFactory : Factory { ///
      <summary> /// 實(shí)現(xiàn)繼承方法 /// </summary> /// <returns></returns> public override
      Phone CreatePhone() {return new Huawei(); } } /// <summary> /// 具體小米工廠類,繼承抽象工廠類
      /// </summary> public class XiaomiFactory : Factory { /// <summary> /// 實(shí)現(xiàn)繼承方法
      /// </summary> /// <returns></returns> public override Phone CreatePhone() {
      return new Xiaomi(); } } #endregion }
      ?
      class Program { static void Main(string[] args) { //初始化工廠 Factory
      huaweiFactory =new HuaweiFactory(); //生產(chǎn)具體的華為手機(jī) var result=
      huaweiFactory.CreatePhone();//華為手機(jī)現(xiàn)世 var answer = result.Create();
      Console.WriteLine(answer); Factory xiaomiFactory= new XiaomiFactory(); result =
      xiaomiFactory.CreatePhone(); answer= result.Create();
      Console.WriteLine(answer); Console.ReadLine(); } }
      ?


        在上述事例中,同樣是先把手機(jī)抽象出一個(gè)抽象類,手機(jī)當(dāng)然也不是憑空出現(xiàn)的。所以需要再抽象一個(gè)工廠類。工廠類派生子類不同的手機(jī)廠商類。同樣手機(jī)也派生了不一樣的品牌。手機(jī)廠商類再對(duì)應(yīng)手機(jī)品牌去生產(chǎn)相應(yīng)的手機(jī)。這時(shí)我們需要增加一個(gè)手機(jī)手機(jī)品牌,我們不需要去修改工廠類及產(chǎn)品類。我們另外新增即可。完全不影響其原來的運(yùn)行。比如我們需要新增魅族手機(jī)。
      #region 新增魅族手機(jī) ================ /// <summary> /// 新增魅族工廠類 /// </summary> public
      class MeizuFactory : Factory { public override Phone CreatePhone() { return new
      Meizu(); } }/// <summary> /// 新增具體魅族手機(jī)產(chǎn)品類 /// </summary> public class Meizu :
      Phone {public override string Create() { return "魅族一號(hào)現(xiàn)世"; } } #endregion
      ?

      在客戶端調(diào)用時(shí)增加以下調(diào)用就可以了
      Factory meizuFactory = new MeizuFactory(); result =
      meizuFactory.CreatePhone(); answer= result.Create(); Console.WriteLine(answer);
      使用場(chǎng)景及優(yōu)缺點(diǎn)

      在此模式中,將所有要?jiǎng)?chuàng)建的具體對(duì)象的工作都延遲放在了子類中去實(shí)現(xiàn),實(shí)現(xiàn)了一種擴(kuò)展的策略。與OCP原則相對(duì)應(yīng)。

      工廠模式主要針對(duì)解決的是”單個(gè)對(duì)象”的問題。隔離類的對(duì)象的使用者與具體類型之間的耦合關(guān)系。去實(shí)現(xiàn)了一定程度的解耦。

      (一)使用場(chǎng)景

      1、當(dāng)用戶不需要知道產(chǎn)品的類名的時(shí)候或者不關(guān)心如何創(chuàng)建的時(shí)候。我們只需要知道創(chuàng)建它的具體工廠的時(shí)候。

      2、將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠中的一個(gè),客戶端使用的時(shí)候無需關(guān)心是哪一個(gè)創(chuàng)建產(chǎn)品。當(dāng)需要?jiǎng)討B(tài)指定。

      (二)優(yōu)點(diǎn)

      1、在編程方法中,客戶端調(diào)用不需要知道產(chǎn)品的具體工廠,也不需要關(guān)心如何創(chuàng)建的。

      2、在增加需求的時(shí)候,增加產(chǎn)品的時(shí)候僅需要新增一個(gè)工廠類及產(chǎn)品類即可,不需要對(duì)原來的代碼進(jìn)行修改??奢p易的擴(kuò)展。

      (三)缺點(diǎn)

      在增加產(chǎn)品的時(shí)候,額外的增加了工廠類及產(chǎn)品類。增加一個(gè)產(chǎn)品增加兩個(gè)類。在一定程度上增加了系統(tǒng)的復(fù)雜度。同時(shí)也增強(qiáng)了類之間的依賴性。這也就是其中不好的問題

      總結(jié)


        每一個(gè)設(shè)計(jì)模式都有對(duì)應(yīng)的使用場(chǎng)合,切勿濫用。在我們學(xué)習(xí)設(shè)計(jì)模式的同時(shí),我們也需要以其原主要?jiǎng)t作為基準(zhǔn)學(xué)習(xí)。萬萬不能違背原則。在設(shè)計(jì)模式——工廠模式中,將創(chuàng)建對(duì)象的任務(wù)委托給其工廠子類、延遲執(zhí)行。解決了系統(tǒng)難于擴(kuò)展的問題,同時(shí)也減少了具體類與對(duì)象之間的耦合性。也實(shí)現(xiàn)了開放擴(kuò)展封閉修改的原則。

        這個(gè)社會(huì)是存在不公平的,不要抱怨,因?yàn)闆]有用!人總是在反省中進(jìn)步的!

        C#設(shè)計(jì)模式系列目錄 <https://www.cnblogs.com/hulizhong/p/11394686.html>

      ?

      歡迎大家掃描下方二維碼,和我一起踏上設(shè)計(jì)模式的闖關(guān)之路吧!

        

      ?

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          人人摸人人摸人人 | 熟妇人妻中文字幕无码老熟妇 | 中国成人免费视频 | 逼逼网址| 日韩视频一区尤物少妇偷拍 | 黄色毛片一级 | 青榴影院 | 深夜成人视频 | 久久极品视频 | 少妇无码视频一区二区色戒 |