1、簡單工廠模式(靜态工廠方法模式)
描述
- 簡單工廠的定義:提供一個建立對象執行個體的功能,而無須關心其具體實作。被建立執行個體的類型可以是接口、抽象類,也可以是具體的類。看下面的例子。
代碼
- Fruit接口
package factory;
public interface Fruit {
public void draw();
}
- Apple類
package factory;
public class Apple implements Fruit {
public void draw() {
System.out.println("蘋果真香");
}
}
- Orange類
package factory;
public class Orange implements Fruit {
public void draw() {
System.out.println("橘子巨香");
}
}
- FruitFactory工廠類
package factory;
public class Factory {
public static Fruit getPerson(String fruitName){
if(fruitName == null)
return null;
if( fruitName.equalsIgnoreCase("Apple"))
return new Apple();
else if( fruitName.equalsIgnoreCase("Orange"))
return new Orange();
else
return null;
}
}
- 測試類
package factory;
public class Main {
public static void main(String[] args) {
Fruit apple = Factory.getPerson("Apple");
Fruit orange = Factory.getPerson("Orange");
apple.draw();
orange.draw();
}
}
- 結果:
深入了解設計模式:java的三種工廠模式 -
優點
1 解耦 :把對象的建立和使用的過程分開
2降低代碼重複: 如果建立某個對象的過程都很複雜,需要一定的代碼量,而且很多地方都要用到,那麼就會有很多的重複代碼。
3 降低維護成本 :由于建立過程都由工廠統一管理,是以發生業務邏輯變化,不需要找到所有需要建立對象B的地方去逐個修正,隻需要在工廠裡修改即可,降低維護成本。
-
缺點
1 擴充性差(我想增加另一個水果,除了新增一個水果類,還需要修改工廠類方法)
2 不同的産品需要不同額外參數的時候 不支援。
适用場景
其實由定義也大概能推測出其使用場景,首先由于隻有一個工廠類,是以工廠類中建立的對象不能太多,否則工廠類的業務邏輯就太複雜了,其次由于工廠類封裝了對象的建立過程,是以用戶端應該不關心對象的建立。總結一下适用場景:
(1)需要建立的對象較少。
(2)用戶端不關心對象的建立過程。
2、工廠方法
描述
- 由于簡單工廠模式隻适用于固定不變的幾個産品,但實際情況确是我們需要動态的增加産品。是以就出現了工廠方法(簡單工廠模式的改進版),建立一個工廠接口。如果出現新的水果類,我們隻需要增加實作工廠接口的類和實作水果接口的類,不必改變原有工廠的代碼。
代碼
- 工廠接口
package factory;
public interface IFactory {
public Fruit getFruit(String fruitName);
}
- 工廠實作類
package factory;
public class Factory {
public Fruit getFruit(String fruitName){
if( fruitName == null)
return null;
if( fruitName.equalsIgnoreCase("Apple"))
return new Apple();
else if( fruitName.equalsIgnoreCase("Orange"))
return new Orange();
else
return null;
}
}
- 水果的代碼和上面的是一樣的。
- 測試類
package factory;
public class Main {
public static void main(String[] args) {
Factory factory = new Factory();
Fruit apple = factory.getFruit("Apple");
apple.draw();
Fruit orange = factory.getFruit("Orange");
orange.draw();
}
}
适用場景
(1)用戶端不需要知道它所建立的對象的類。例子中我們不知道每個圖檔加載器具體叫什麼名,隻知道建立它的工廠名就完成了床架過程。
(2)用戶端可以通過子類來指定建立對應的對象。
以上場景使用于采用工廠方法模式。
3、抽象工廠模式
- 有了工廠方法模式,可以解決很大部分創造類的問題,但還有一個現實中的問題,有一個工廠的話可以創造一系列産品 ,如果工廠方法模式的話就需要創造一系列的工廠來完成這種效果,如何來解決這個問題呢?對于一些系列工廠問題就可以用一個可以系列描述的工廠來表示,每個工廠都有系列的的生産方法,也就是說是生産工廠的工廠。
- 抽象工廠是生産一整套有産品的(至少要生産兩個産品),這些産品必須互相是有關系或有依賴的,而工廠方法中的工廠是生産單一産品的工廠。
//抽象工廠類
abstract class Factory{
abstract ProductA create();
abstract ProductB create();
}
//工廠M
class FactoryM{
public ProductA create(){
return new ProductA();
}
public ProductB create(){
return new ProductB();
}
}
//工廠N
class FactoryN{
public ProductA create(){
return new ProductA();
}
public ProductB create(){
return new ProductB();
}
}
//産品父類
abstract class Product{}
//産品子類A
abstract class ProductA extends Product{}
//産品子類B
abstract class ProductB extends Product{}
//系列M産品
class ProductAM extends ProductA{}
class ProductBM extends ProductB{}
//系列N産品
class ProductAN extends ProductA{}
class ProductBN extends ProductB{}
public class App{
public static void main(String[] args){
ProductA p;
Factory f=new FactoryM()
//消費者類中創造A産品
p=f.create();
}
}
适用場景
(1)和工廠方法一樣用戶端不需要知道它所建立的對象的類。
(2)需要一組對象共同完成某種功能時。并且可能存在多組對象完成不同功能的情況。
(3)系統結構穩定,不會頻繁的增加對象。(因為一旦增加就需要修改原有代碼,不符合開閉原則)