工廠(Creator):簡單工廠模式的核心,它負責實現建立全部實例的內部邏輯。工廠類能夠被外界直接調用,建立所需的產品對象。mysql
抽象(Product):簡單工廠模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。sql
具體產品(Concrete Product):簡單工廠模式所建立的具體實例對象。數據庫
抽象:oracle
public interface Fruit { /* 採集水果 */ public void get(); }
工廠:app
public class FruitFactory { public static Fruit getFruit(String type) { try { if (type.equalsIgnoreCase("apple")) { return Apple.class.newInstance(); } else if (type.equalsIgnoreCase("banana")) { return Banana.class.newInstance(); } else { System.out.println("沒有這個類"); return null; } } catch (Exception e) { e.printStackTrace(); } return null; } }
具體產品:框架
//實現1 public class Apple implements Fruit { public void get() { System.out.println("採集蘋果"); } } //實現2 public class Banana implements Fruit{ public void get(){ System.out.println("採集香蕉"); } }
測試類ide
public class MainClass { public static void main(String[] args) { Fruit apple = FruitFactory.getFruit("Apple"); Fruit banana = FruitFactory.getFruit("banana"); apple.get(); banana.get(); } }
優勢:用戶在使用時能夠直接根據工廠類去建立所需的實例,而無
需瞭解這些對象是如何建立以及如何組織的。有利於整個軟件體系結構的優化。測試
因爲工廠類集中了全部實例的建立邏輯,因此「高內聚」方面作的並很差。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要作相應的修改,擴展性並不很好。優化
簡單工廠模式適合擁有固定的實現類,當別人設計好以後,咱們只須要調用就好了,但違反了開放-封閉的原則,想要增長新的實現類,就必需要修改工廠方法。ui
在Dao層的實現上,如在MVC框架層上定義一個接口,其中有多個實現類,咱們不須要理解實現類是怎樣實現的,只須要經過父類建立子類的對象便可。
如在鏈接數據庫的時候,框架給咱們提供了一個管理數據庫鏈接的工廠類,在實現類中可能有多個實現類(mysql , mssql , oracle等),咱們只須要經過工廠類建立出實現類的對象便可。
抽象工廠(Creator): 工廠方法模式的核心,任何工廠類都必須實現這個接口。
具體工廠( Concrete Creator): 具體工廠類是抽象工廠的一個實現,負責實例化產品對象。
抽象(Product): 工廠方法模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。
具體產品(Concrete Product): 工廠方法模式所建立的具體實例對象。
核心工廠(抽象工廠):負責管理工廠,不負責工廠的建立
public interface FruitFactory { public Fruit getFruit(); }
具體工廠:負責對各個實例的初始化
public class BananaFactory implements FruitFactory { @Override public Fruit getFruit() { return new Banana(); } } public class AppleFactory implements FruitFactory { @Override public Fruit getFruit() { return new Apple(); } }
抽象:全部實例化對象都擁有的方法
public interface Fruit { /* 採集水果 */ public void get(); }
具體產品
public class Apple implements Fruit { public void get() { System.out.println("採集蘋果"); } } public class Banana implements Fruit{ public void get(){ System.out.println("採集香蕉"); } }
測試建立類
public class MainClass { public static void main(String[] args) { FruitFactory appleFactory = new AppleFactory(); Fruit apple = appleFactory.getFruit(); apple.get(); FruitFactory bananaFactory = new BananaFactory(); Fruit banana = bananaFactory.getFruit(); banana.get(); } }
當系統擴展須要添加新的產品對象時,僅僅須要添加一個具體對象以及一個具體工廠對象,原有工廠對象不須要進行任何修改,也不須要修改客戶端,很好的符合了「開放-封閉」原則。而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性很差。
定義:抽象工廠模式是全部形態的工廠模式中最爲抽象和最其通常性的。抽象工廠模式能夠向客戶端提供一個接口,使得客戶端在沒必要指定產品的具體類型的狀況下,可以建立多個產品族的產品對象。
抽象工廠中角色和職責
抽象工廠(Creator):抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。
具體工廠( Concrete Creator):具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
抽象(Product):抽象模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
具體產品(Concrete Product):抽象模式所建立的具體實例對象。
抽象工廠中方法對應產品結構,具體工廠對應產品族。
抽象工廠:
public interface FruitFactory { //實例化Apple public Fruit getApple(); //實例化Banana public Fruit getBanana(); }
抽象:
public abstract class Banana implements Fruit{ /* * 採集 */ public abstract void get(); } public abstract class Apple implements Fruit { /* * 採集 */ public abstract void get(); }
具體工廠
public class NorthFruitFactory implements FruitFactory { public Fruit getApple() { return new NorthApple(); } public Fruit getBanana() { return new NorthBanana(); } } public class SouthFruitFactory implements FruitFactory { public Fruit getApple() { return new SouthApple(); } public Fruit getBanana() { return new SouthBanana(); } }
具體產品:
public class NorthBanana extends Banana { public void get() { System.out.println("採集北方香蕉"); } } public class NorthApple extends Apple { public void get() { System.out.println("採集北方蘋果"); } } public class SouthApple extends Apple { public void get() { System.out.println("採集南方蘋果"); } } public class SouthBanana extends Banana { public void get() { System.out.println("採集南方香蕉"); } }
測試類
public class MainClass { public static void main(String[] args) { FruitFactory ff = new NorthFruitFactory(); Fruit apple = ff.getApple(); apple.get(); Fruit banana = ff.getBanana(); banana.get(); FruitFactory ff2 = new SouthFruitFactory(); Fruit apple2 = ff2.getApple(); apple2.get(); Fruit banana2 = ff2.getBanana(); banana2.get(); } }
對工廠方法的使用舉例:
http://blog.csdn.net/dawanganban/article/details/9884681