天天看點

深入了解設計模式:java的三種工廠模式

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();
	}
}
           
深入了解設計模式:java的三種工廠模式

适用場景

(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)系統結構穩定,不會頻繁的增加對象。(因為一旦增加就需要修改原有代碼,不符合開閉原則)

繼續閱讀