簡單工廠設計模式

1. 概述

簡單工廠模式又叫做靜態工廠方法(Static Factory Method)模式,不屬於23種GOF設計模式之一。

簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解爲是不同工廠模式的一個特殊實現。

2.  示例程序

簡單工廠模式要有一個工廠類,這裏其名爲Factory。

一個產品接口類,IProduct類。

一些實際產品,Product類,Product類需要實現產品接口類(IProduct),Product類可以有多個,例如Product01,Product02,Product03。

工廠可以通過傳入的參數生成具體的產品,UML圖如下所示:

工廠類,Factory.java:

package simpleFactory.example;

public class Factory {
    public static IProduct getIProductInstance(String className) {
        IProduct result = null;

        if(className.equals("product01")) {
            result = new Product01();
        } else if(className.equals("product02")){
            result = new Product02();
        } else if(className.equals("product03")){
            result = new Product03();
        }

        return result;
    }
}

產品接口類,IProduct.java:

package simpleFactory.example;

public interface IProduct {
    public void use();
}

具體產品類,Product01.java:

package simpleFactory.example;

public class Product01 implements IProduct {
    @Override
    public void use() {
        System.out.println("use product01");
    }
}

具體產品類,Product02.java:

package simpleFactory.example;

public class Product02 implements IProduct {
    @Override
    public void use() {
        System.out.println("use product02");
    }
}

具體產品類,Product03.java:

package simpleFactory.example;

public class Product03 implements IProduct {
    @Override
    public void use() {
        System.out.println("use product03");
    }
}

測試類,main.java:

package simpleFactory.example;

public class main {
    public static void main(String args[]) {
        IProduct iProduct = Factory.getIProductInstance("product03");
        iProduct.use();


        iProduct = Factory.getIProductInstance("product02");
        iProduct.use();


        iProduct = Factory.getIProductInstance("product01");
        iProduct.use();
    }
}

運行截圖:

3. 具體產品很多

上述的示例有一個問題,如果具體物品很多的話,工廠類中中的分支語句(if,else)寫不完了。

        if(className.equals("product01")) {
            result = new Product01();
        } else if(className.equals("product02")){
            result = new Product02();
        } else if(className.equals("product03")){
            result = new Product03();
        }
        ...

使用反射可以解決上述問題,修改工廠類,通過類的絕對路徑名獲得其class,再獲得他的實例。Factory01.java:

package simpleFactory.example1;

import simpleFactory.example.IProduct;

public class Factory01 {
    public static IProduct getIProductInstance(String className) {
        IProduct result = null;
        try {
            result = (IProduct) Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

測試類,main.java,simpleFactory.example.Product01爲類的路徑:

package simpleFactory.example1;

import simpleFactory.example.IProduct;

public class main {
    public static void main(String args[]) {
        IProduct iProduct = Factory01.getIProductInstance("simpleFactory.example.Product01");
        iProduct.use();

        iProduct = Factory01.getIProductInstance("simpleFactory.example.Product02");
        iProduct.use();

        iProduct = Factory01.getIProductInstance("simpleFactory.example.Product03");
        iProduct.use();
    }
}

運行截圖如下所示:

4. 多類產品

假如有多類產品,例如添加了用戶類。

可以使用泛型來解決這個問題,不固定的去使用IProduct。

工廠類,Factory03.java,如下所示:

package simpleFactory.example2;

public class Factory03 {
    public static <T> T getIProductInstance(String className) {
        T result = null;
        try {
            result = (T) Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

測試類,main.java:

package simpleFactory.example2;

public class main {
    public static void main(String args[]) {
        IProduct iProduct = Factory03.getIProductInstance("simpleFactory.example2.Product01");
        iProduct.use();

        iProduct = Factory03.getIProductInstance("simpleFactory.example2.Product02");
        iProduct.use();

        iProduct = Factory03.getIProductInstance("simpleFactory.example2.Product03");
        iProduct.use();

        IUser iUser = Factory03.getIProductInstance("simpleFactory.example2.User03");
        iUser.use();

        iUser = Factory03.getIProductInstance("simpleFactory.example2.User02");
        iUser.use();

        iUser = Factory03.getIProductInstance("simpleFactory.example2.User01");
        iUser.use();
    }
}

運行截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章