1. 程式人生 > >應用最廣泛的模式——工廠方法模式

應用最廣泛的模式——工廠方法模式

背景

工廠方法是建立型設計模式之一,工廠方法模式是一種結構簡單的模式,在我們的開發之中應用十分廣泛,作為一個java程式設計師,我們實在有必要去深入理解

一、工廠方法模式定義

定義一個用於建立物件的介面,讓子類決定例項化哪個類

工廠化方法模式在任何需要生成複雜的物件適合使用工廠模式,用new就可以建立的物件無須使用工廠模式

二、普通工廠方法模式

public abstract class Product {
/**
 * 產品類的抽象方法
 * 由具體產品類去實現
 */
    public abstract void mothod();
}
public
class ConcreteProductA extends Product{ @Override public void mothod() { // TODO 自動生成的方法存根 System.out.println("我是具體產品A"); } }

public class ConcreteProductB extends Product{

    @Override
    public void mothod() {
        // TODO 自動生成的方法存根
        System.out.println("我是具體產品B"
); } }
public abstract class Factory {

    /**
     * 抽象工廠方法 具體產品讓子類去實現
     */
    public abstract Product createProduct();
}
public class ConcreteProductA extends Product{

    @Override
    public void mothod() {
        // TODO 自動生成的方法存根
        System.out.println("我是具體產品A");
    }
}
public
class Client { public static void main(String[] args) { ConcreteFactory concreteFactory = new ConcreteFactory(); Product p = concreteFactory.createProduct(); p.mothod(); } }

這裡的幾個角色很簡單,主要分為四大模組,一是抽象工廠,其為工廠方法模式的核心,二是具體工廠,其實現了具體的業務邏輯,三是抽象產品,是工廠方法模式所建立的產品的父類,四是具體產品,為實現抽象產品的某個具體產品物件。

上訴的程式碼中我們在Client類中構建了一個工廠物件,並通過其生產了一個產品物件,這裡我們得到的產品物件是ConcreateProdcutA的例項,如果想得到ConcreateProdcutB的例項,更改ConcreteFactory中的邏輯即可。

三、反射呼叫工廠模式

除了上述的方式使用工廠模式,比較常用的還有通過反射來會更加簡潔來生產具體產品物件,此時,需要在工廠方法中傳入一個方法的引數class類來決定是生產哪一個產品類

public abstract class Factory2 {

    public abstract <T extends Product> T createProduct(Class<T> clz);
}
public class ConcreteFactory2  extends Factory2{
    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        // TODO 自動生成的方法存根
        Product product=null;
         try {
            product = (Product) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
        return (T)product;
    }
}

需要哪個類的物件就傳入哪個類的型別即可,這種方法比較簡潔、動態,如果你不喜歡這種方式,也可以嘗試為每個產品都定義一個具體的工廠,各司其職。

四、靜態工廠模式

public class StaticFactory {
    public  static Product  createProduct(){
        return new ConcreteProductA();
    }

}

像這種方法我們稱為簡單工廠或者靜態工廠方法模式,它是工廠方法模式的一種弱化版本,可以很方便地去呼叫它。

其實工廠模式完全符合設計原則,減低了物件之間的耦合度,而且,工廠方法模式依賴於抽象的架構,其將例項化的任務交由子類去完成,有非常好的擴充套件性。

五、總結

總的來說,工廠方法模式是一個很好的設計模式,在本文多處用到有對其優點進行總結,但是缺點也是有的,每次我們為工廠方式新增新的產品時就要編寫一個新的產品類,同時還要引入抽象層,這必然導致結構的複雜化,所以在某些情況下是否使用工廠模式,需要設計者權衡利弊了。