Java基礎——工廠模式
通過學習,一句話概括Java工廠模式的特點——通過建立一個工廠來創建對象,不必關心構造對象實例能不能被實例化啊等諸多細節和復雜過程。
工廠模式呢?就像我們從勞動密集型社會轉型到技術密集型社會。打個比方,從前要制造一個桌子,從上山選木頭、砍木頭、運木頭,到設計桌子,制造桌子等細節問題都需要一個人去做好,由於付出的勞動成本極高和技術學成的時間等問題,一般一個木匠在創新方面有一定的局限性。後來,人們步入了工業時代,制造業的發展突飛猛進,另外,倡導分工細化。比如,電腦的制造廠商,它懂得怎樣裝好一部電腦和誰的零部件做的好,這個電腦廠商不必知道每個零部件的制作細節,但是,一樣可以制造出來性能優越(算是一種取最優吧)的電腦。
一、工廠模式
工廠模式主要是為創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
二、工廠模式分為三類
1.簡單工廠模式(Simple Factory)
2.工廠方法模式(Factory Method)
3.抽象工廠模式(Abstract Factory)
這三種模式從上到下逐步抽象,並且更具一般性。
工廠方法模式:
一個抽象產品類,可以派生出多個具體產品類; 一個抽象工廠類,可以派生出多個具體工廠類;每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類;一個抽象工廠類,可以派生出多個具體工廠類;每個具體工廠類可以創建多個具體產品類的實例。
三、簡單工廠模式
建立一個工廠(一個函數或一個類方法)來制造新的對象。
代碼實例:
1 public class Dog { 2 private String name; 3 private String address; 4 5 void shout() { 6 System.out.println("汪汪汪~~"); 7 } 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) {14 this.name = name; 15 } 16 17 public String getAddress() { 18 return address; 19 } 20 21 public void setAddress(String address) { 22 this.address = address; 23 } 24 } 25 26 class DogFactory { 27 static public Dog getDog() { 28 // return new Dog(); 29 Dog dog = new Dog(); 30 dog.setAddress("浙江杭州"); 31 dog.setName("M.zhou"); 32 return dog; 33 } 34 } 35 36 class Test2 { 37 public static void main(String[] args) { 38 Dog dog = DogFactory.getDog(); 39 Dog dog2 = DogFactory.getDog(); 40 Dog dog3 = DogFactory.getDog(); 41 42 System.out.println(dog == dog2); // false 43 } 44 }
四、工廠方法模式
工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承。這樣在簡單工廠模式裏集中在工廠方法上的壓力可以由工廠方法模式裏不同的工廠子類來分擔。
工廠方法模式組成:
1.抽象工廠角色:
工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
2.具體工廠角色:
它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。
3.抽象產品角色:
它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
4.具體產品角色:
具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。
工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。這樣便分擔了對象承受的壓力;而且這樣使得結構變得靈活 起來,前面學習過面向對象的三大特性,繼承、封裝和多態,工廠模式是將這三大特性集合起來的應用,同時工廠角色的結構也是符合開閉原則的。
下面舉個例子:
/* * @author M.zhou * @date 2017-7-1 下午 18:59 * version 1.0 * */ //創建電腦制造工廠 public interface MyFactory { public MyBattery createBattery(); // 定義創建電池 public MyDisplay createDisplay(); // 定義創建顯示器 public MyMotherBoard createMotherBorad(); // 定義創建主板 public MyShell createShell(); // 定義創建外殼 }
//創建電腦原材料工廠,負責提供電池、顯示屏、主板和外殼 public class ComFactory implements MyFactory { @Override public <MyBattery> MyBattery createBattery() { // TODO Auto-generated method stub return new SuperBattery; } @Override public MyDisplay createDisplay() { // TODO Auto-generated method stub return new SuperDisplay; } @Override public MyMotherBoard createMotherBorad() { // TODO Auto-generated method stub return new SuperMotherBoard; } @Override public MyShell createShell() { // TODO Auto-generated method stub return new SuperShell; } }
//創建電腦裝配廠的接口,只負責從原材料那裏獲取材料並配置成新型電腦。其他的它一概不管 public interface ComAssemblyPlant { public Computer Assembley(); }
//新型電腦裝配廠(可以根據市場需求,更換、升級零件,制造新型電腦) public class NewComputerFactory implements ComAssemblyPlant { MyFactory materialFactory; // 原料工廠 @Override public Computer Assembley() { Computer computer=new Computer(); computer.setBattery(materialFactory.createBattery()); computer.setDisplay(materialFactory.createDisplay()); computer.setMotherBoard(materialFactory.createMotherBorad()); computer.setShell(materialFactory.createShell()); return computer; } }
Java基礎——工廠模式