1. 程式人生 > >java設計模式之——簡單工廠、工廠方法模式、抽象工廠模式(建立性)【讀書筆記】

java設計模式之——簡單工廠、工廠方法模式、抽象工廠模式(建立性)【讀書筆記】

1、簡單工廠模式

           應用場景,程式設計中通過工廠方法接受一個引數,建立不同類型別的例項。

           設計示意圖

                          

             例項

                       1、定義抽象產品類

                             public abstract class Rice {
                                   public void prepare(){
                                        System.out.println("準備米飯!");
                                    }
                                    public void cook(){
                                         System.out.println("烹飪米飯!");
                                     }
                                     public void packageRice(){
                                          System.out.println("打包米飯!");
                                      }
                                }

                        2、產品類實現類,牛肉飯、羊肉飯

                                 public class BeafRice extends Rice {
                                        @Override
                                         public void prepare(){
                                                System.out.println("準備牛肉飯!");
                                          }
                                         @Override
                                          public void cook(){
                                                  System.out.println("烹飪牛肉飯!");
                                           }
                                          @Override
                                           public void packageRice(){
                                                    System.out.println("打包牛肉飯!");
                                            }
                                     }

                                     public class SheetRice extends Rice {
                                            @Override
                                             public void prepare(){
                                                  System.out.println("準備羊肉飯!");
                                              }
                                              @Override
                                               public void cook(){
                                                    System.out.println("烹飪羊肉飯!");
                                                }
                                               @Override
                                               public void packageRice(){
                                                    System.out.println("打包羊肉飯!");
                                                }
                                       }

                        3、簡單工廠,根據傳入引數生產不同型別產品
                                       public class SimpleRiceFactory {
                                             private SimpleRiceFactory (){};

                                             private static class Innerclass{

                                                    public static final SimpleRiceFactory  simpleRiceFactory = new SimpleRiceFactory ();

                                              }

                                              public static SimpleRiceFactory  getInstance(){

                                                      return Innerclass.simpleRiceFactory;

                                              }
                                              public Rice produceRice(Class rice){
                                                     Rice riceTemp = null;
                                                     try {
                                                           riceTemp = (Rice)Class.forName(rice.getName()).newInstance();            
                                                      } catch (Exception e) {
                                                           System.out.println("不支援Rice類介面型別");
                                                            e.printStackTrace();
                                                            // TODO: handle exception
                                                      }
                                                      return riceTemp;
                                                }
                                            }

                        4、產品使用者,服務員,根據客戶需求,訂購米飯!

                                 public class Waiter {
                                       private SimpleRiceFactory simpleRiceFactory;
                                       public Waiter(SimpleRiceFactory simpleRiceFactory){
                                             this.simpleRiceFactory= simpleRiceFactory;
                                       }
                                       public void order(Class type){
                                             Rice rice = simpleRiceFactory.produceRice(type);
                                             rice.prepare();
                                             rice.cook();
                                             rice.packageRice();
                                       }
                                  }

                       5、 實現客戶端                                  

                                public class Client {

                                     public static void main(String[] args) {
                                           Waiter waiter = new Waiter(SimpleRiceFactory.getInstance());
                                           waiter.order(BeafRice.class);
                                           waiter.order(SheetRice.class);
                                      }
                                 }

                        總結        

                              1、當飯的"產品種類"(Rice)頻繁變化時,waiter類無需修改。

                              2、去除了客戶端與具體產品的依賴,封裝了物件的建立過程。

                              3、工廠類中包含了所有例項建立的邏輯,一旦工廠出問題,所有客戶端都會有問題。

                              4、當增加產品型別,如麵條類,則那麼SimpleRiceFactory則無法滿足生產要求,這違反了軟體設計的開閉原則。

2、工廠方法模式

            相對於簡單工廠模式,工廠方法模式更多樣化。這種模式包含多個工廠,每個工廠對應一類產品,這樣減輕了簡單工廠的壓力。且在新增型別時也遵循了軟體設計的開閉原則,不會對其他產品對應的工廠產生影響。

            設計示意圖

            例項

                在簡單工廠模式的基礎上,新增產品類IProductNoodles 以及產品 BeafNoodles、SheetNoodles。

                 定義工廠類介面

                             public interface IProductFactory {
                                    public Object produce(Class type);
                              }

                  新增麵條類工廠        

                             public class SimpleNoodlesFactory implements IProductFactory{

                                      private SimpleNoodlesFactory(){};
    
                                      private static class InnerClass{
                                               public static final SimpleNoodlesFactory INSTANCE = new SimpleNoodlesFactory();
                                      }
    
                                      public static SimpleNoodlesFactory getInstance(){
                                                 return InnerClass.INSTANCE;
                                       } 
                                       @Override
                                       public IProductNoodles produce(Class type) {
                                                  // TODO Auto-generated method stub
                                                  IProductNoodles noodles = null;
                                                  try {
                                                        noodles = (IProductNoodles)Class.forName(type.getName()).newInstance();
                                                   } catch (InstantiationException e) {
                                                         // TODO Auto-generated catch block
                                                          e.printStackTrace();
                                                   } catch (IllegalAccessException e) {
                                                           // TODO Auto-generated catch block
                                                            e.printStackTrace();
                                                    } catch (ClassNotFoundException e) {
                                                            // TODO Auto-generated catch block
                                                            e.printStackTrace();
                                                    }
                                                    return noodles;
                                         }

                                  }

                  定義waiter服務員

                                  public class Waiter {
                                            private static IProductFactory productFactory;
                                            public void setIProductFactory(IProductFactory productFactory){
                                                      this.productFactory = productFactory;
                                            }
                                             public void orderRice(Class rice){
                                                       IProductRice riceTemp = (IProductRice)productFactory.produce(rice);
                                                       riceTemp.prepare();
                                                       riceTemp.cook();
                                                       riceTemp.packageRice();
                                              }
                                              public void orderNoodles(Class noodles){
                                                         IProductNoodles noodlesTemp = (IProductNoodles)productFactory.produce(noodles);
                                                         noodlesTemp.prepare();
                                                         noodlesTemp.cook();
                                                         noodlesTemp.packageNoodles();
                                                }
                                        }        

                    定義client客戶端

                                         public class Client {
                                                   public static void main(String[] args) {
                                                           Waiter waiter = new Waiter();
                                                           waiter.setIProductFactory(SimpleRiceFactory.getInstance());
                                                           waiter.orderRice(BeafRice.class);
                                                           waiter.orderRice(SheetRice.class);
        
                                                           waiter.setIProductFactory(SimpleNoodlesFactory.getInstance());
                                                           waiter.orderNoodles(BeafNoodles.class);
                                                           waiter.orderNoodles(SheetNoodles.class);    
                                                     }
                                               }

                        總結   

                        在可維護和可擴充套件性上非常差,沒有利用多型性,容易造成過多的程式碼。

3、抽象工廠模式

              相對於簡單工廠模式和工廠方法模式 ,抽象工廠模式引入了產品族的概念。產品族,可以理解為由不同型別產品組合在一起在同一個工廠中生產的型別。結合反射,將工廠方法模式中米飯工廠和麵條工廠合併為一個工廠(包含生產米飯和麵條)。

                修改工廠類的介面如下:

                        public interface IProductFactory {
    
                                  public IProductNoodles produceNoodles(Class type);
    
                                  public IProductRice produceRice(Class type);
                         }

                工廠類實現類如下:

                         public class ProductFactory implements IProductFactory{
                            private ProductFactory(){};
                            private static class Innerclass{
                                public static final ProductFactory INSTANCE = new ProductFactory();
                            }
                            public static ProductFactory getInstance(){
                                return Innerclass.INSTANCE;
                            }
                            @Override
                            public IProductNoodles produceNoodles(Class type) {
                                // TODO Auto-generated method stub
                                IProductNoodles noodles  = null;
                                try {
                                    noodles = (IProductNoodles)Class.forName(type.getName()).newInstance();
                                } catch (Exception e) {
                                    // TODO: handle exception
                                }
                                return noodles;
                            }
                            @Override
                            public IProductRice produceRice(Class type) {
                                // TODO Auto-generated method stub
                                IProductRice rice  = null;
                                try {
                                    rice = (IProductRice)Class.forName(type.getName()).newInstance();
                                } catch (Exception e) {
                                    // TODO: handle exception
                                }
                                return rice;
                            }
                        }

                waiter類如下:

                          public class Waiter {
                            private static IProductFactory productFactory;
                            public void setIProductFactory(IProductFactory productFactory){
                                this.productFactory = productFactory;
                            }
                            public void orderRice(Class rice){
                                IProductRice riceTemp = (IProductRice)productFactory.produceRice(rice);
                                riceTemp.prepare();
                                riceTemp.cook();
                                riceTemp.packageRice();
                            }
                            public void orderNoodles(Class noodles){
                                IProductNoodles noodlesTemp = (IProductNoodles)productFactory.produceNoodles(noodles);
                                noodlesTemp.prepare();
                                noodlesTemp.cook();
                                noodlesTemp.packageNoodles();
                            }
                        }

                  最後修改客戶端為:

                          public class Client {
                                public static void main(String[] args) {
                                    Waiter waiter = new Waiter();
                                    waiter.setIProductFactory(ProductFactory.getInstance());
                                    waiter.orderRice(BeafRice.class);
                                    waiter.orderRice(SheetRice.class);

                                    waiter.orderNoodles(BeafNoodles.class);
                                    waiter.orderNoodles(SheetNoodles.class);    
                                }
                            }

                      總結 

                        抽象工廠方法模式的不足在於每次新增產品類時,需要修改抽象類介面、抽象工廠實現類。

相關推薦

java設計模式——簡單工廠工廠方法模式抽象工廠模式建立性讀書筆記

1、簡單工廠模式            應用場景,程式設計中通過工廠方法接受一個引數,建立不同類型別的例項。            設計示意圖                                         例項                  

java設計模式——建造者模式原型模式建立性讀書筆記

一、建造者模式(生成器模式)                 定義:將一個複雜物件的構建和它的表示分離開,使得同樣的構建過程可以得到不同的表示。                 效果:採用建造者模式,使用者只需要選擇建造的型別就可以得到它們,而具體的建造過程和細節就不需要

java設計模式——策略模式模板方法模式觀察者模式迭代子模式責任鏈模式命令模式備忘錄模式狀態模式訪問者模式中介者模式直譯器模式行為型讀書筆記

一、策略模式           定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。           使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不

window service 學習學習筆記 -- 啟動服務出錯,提示1053 ,刪掉服務

先把錯誤的圖粘出來,大家看看: 出現這個症狀後,服務“半死不活”了,一直處理“啟動”中這個狀態,沒完沒了的啟動中了。 眾所周知,一般服務狀態是“已啟動”,“已禁用”等等,沒有這個啟動中啊。 所以看著這個“半死不活”的服務就煩,想辦法“幹掉”它。 於是,百度,Google了

C#設計模式八橋接模式Bridge結構型

升級 方向 implement 詳細 .cn mage names 這樣的 意圖 一、引言 今天我們要講【結構型】設計模式的第二個模式,該模式是【橋接模式】,也有叫【橋模式】的。大家第一次看到這個名稱會想到什麽呢?我第一次看到這個模式根據名稱猜肯定是連接什麽東西的。因為

讀書筆記Java 工程師修煉

日期:2018年10月19日 13:09 地點:玉泉慧谷 圖書:《Java 工程師修煉之道》2018年3月出版 一、記錄 前天晚上睡前無聊,在多看app裡搜了下 Java 相關的電子書。有 3 本成功吸引了我的注意力,其中一本就是上面提到的這個。看到的時候,已經很

讀書筆記JAVA基礎:1深入理解JVM

  通過《深入理解JAVA虛擬機器》和《深入理解計算機系統》兩本經典著作的學習,注重瞭解系統程序執行時記憶體結構的變化,以此徹底瞭解JVM虛擬機器在執行JAVA程式時的記憶體結構!       主要有三個方面:   &nb

讀書筆記大話設計模式—六大設計原則

1、設計原則概念 (1)單一職責原則:一個類只負責一個功能領域的相應職責或定義為只對外提供一種功能,即引起類變化的原因只有一個。 (2)開閉原則:軟體實體對擴充套件開放,對修改關閉。即軟體實體儘量在不

讀書筆記大話設計模式—代理模式

代理模式(使用頻率:4顆星):       代理模式(Proxy):為其他物件提供一個代理以控制對這個物件的訪問。 代理模式:給某一個物件提供一個代理或佔位符,並由代理物件來控制對原物件的訪問

讀書筆記設計心理學2-如何管理復雜

然而 困難 虛擬 前行 方式 間接 行為 這就是 找到 最近在看一些書籍,感覺不寫一些筆記,效果不是特別明顯。出於這個目的,於是有了下面的讀書筆記文章。 從《設計心理學2-如何管理復雜》開始寫吧。在看這本書之前,其實自己覺得各種事情只要肯學習,其實都是挺簡單的。但看了本書

讀書筆記計算機網絡1章:課程介紹協議分層

視頻 打印 http dns 物理層 size cli 電子商務 ann 改變 這是我在Coursera上的學習筆記。課程名稱為《Computer Networks》。出自University of Washington。 因為計算機網絡才誕生不久

讀書筆記《Effective Java》——創建和銷毀對象

auth static 直接 cdr 也會 pattern cal next false Item 1. 考慮用靜態工廠方法替代構造器 獲得一個類的實例時我們都會采取一個公有的構造器。Foo x = new Foo(); 同時我們應該掌握另一種方法就是靜態工廠方法(st

讀書筆記讀《重構 改善既有代碼的設計》有感

表達 感悟 quic -s 根據 bsp 關註 計算 有感 一、書籍介紹   書名:《重構 改善既有代碼的設計》 作者:[美]Martun Fowler 譯者:熊節 出版社:人民郵電出版社 二、背景   深知自己的代碼水平,但自己又有一點代碼潔癖,看不慣的

讀書筆記構建CH7~CH8

計劃 isp 數量 round 體驗 讀書 alert com 人力 MSF九大原則: 1. 推動信息共享與溝通:“諧”,Alert 2. 為共同的遠景而工作:目標明確—用戶/老板 3. 充分授權和信任: 4. 各司其職,對項目共同負責: 5. 交付增量的價值: 6. 保持

Python小白學習函數函數返回值函數參數

函數返回值 列表 默認參數 print 關鍵字 內部 if條件語句 pre 提取 寫在前面: 昨天早睡之後,感覺今天已經恢復了百分之八十的樣子 又是活力滿滿的小夥郭 今日份雞湯: 我始終相信,在這個世界上,一定有另一個自己,在做著我不敢做的事,在過著我想過的生活。-----

讀書筆記《Linux核心設計與實現》程序管理與程序排程

大學跟老師做嵌入式專案,寫過I2C的裝置驅動,但對Linux核心的瞭解也僅限於此。Android系統許多導致root的漏洞都是核心中的,研究起來很有趣,但看相關的分析文章總感覺隔著一層窗戶紙,不能完全理會。所以打算系統的學習一下Linux核心。買了兩本書《Linux核心設計與實現(第3版)》和《深入理解Lin

讀書筆記數學美2-搜尋引擎

8.簡單之美——布林代數和搜尋引擎 建立一個搜尋引擎大致需要做的幾件事情: 自動下載儘可能多的網頁; 建立快速有效的索引; 根據相關性對網頁進行公平準確的排序。 這就是搜尋的“道”。 關鍵詞=布林運算(詞1,詞2,詞3);接著判斷詞i是否在文獻中,以得到一串二進

讀書筆記數學美2--從規則到統計

這本書重於“道”,所以不應該著眼於其中的“術”。悟“道”才可以在今後的研究生涯中篤定地前行。 目錄   1.文字和語言vs數字和資訊 1.1 資訊 1.2 文字和數字 1.3 小結 2.自然語言處理 3.統計語言模型 3.1 用數學的方法描述語言規律

java基礎-中級泛型

目錄 2、泛型 2.1 泛型方法 2.2 泛型類 2.3 泛型介面 2.4 泛型的約束與侷限 2.5 泛型型別繼承規則  2.6 Class<T> 2、泛型 Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型

Filter過濾器Listener監聽器Servlet總結

Filter Filter攔截請求和響應,以便檢視、提取或以某種方式操作正在客戶機和伺服器之間交換的資料,可以改變一個請求(request)或者修改響應(respond)。使用者傳送請求給Servlet時,在Servlet處理請求之前,與此Servlet相關的Filter首