天天看點

簡單工廠模式

簡單工廠模式就是由一個工廠類根據傳入的參數決定建立出哪一種産品類的執行個體。

簡單工廠模式又稱為靜态工廠方法模式(Static Factory Method Pattern),因為其主要邏輯方法多用static關鍵字修飾。

這種模式下,用戶端隻負責發送參數,由工廠對象去決定建立哪種産品。

優缺點

  • 優點
簡單工廠模式的核心是工廠類,其中包含了必要的判斷邏輯,由此決定應該去建立哪個對象。

而用戶端不需要去了解如何建立産品,完全和産品邏輯解耦,它隻負責發送指令去“消費”就好了。

  • 缺點
建立所有産品的邏輯都放在工廠類中,工廠需要知道每一種産品的建立過程,邏輯過于集中。

添加新的産品生産邏輯時,勢必會違反開閉原則,因為要修改工廠類。

Java中的簡單工廠

DateFormat類中有以下靜态方法:

public final static DateFormat getDateInstance()
public final static DateFormat getDateInstance(int style)
public final static DateFormat getDateInstance(int style, Locale aLocale)           

這些方法根據傳入參數去構造一個DateFormat的子類對象并傳回,而用戶端隻需要傳遞參數即可,不去關心具體的子類類型。

如果沒有這些簡單工廠方法,用戶端則需要去了解DateFormat的子類,自己去指定去new哪個子類的對象。

Spring

spring中BeanFactory有如下方法:

Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;           

這就是簡單工廠的使用例子,而工廠接收的參數可以通過讀取如下配置方式傳入:

<bean id="helloWorld" 
 class="com.test.spring.beans.HelloWorld"></bean>           

執行個體

需求: 建立一個生産蒙牛,伊利,特侖蘇牛奶的簡單工廠。

  • 牛奶抽象接口
package com.faith.net;

/**
 * 牛奶抽象接口
 */
public interface Milk {

    /**
     * 擷取一個标準産品
     * @return
     */
    public String getName();

}           
  • 特侖蘇牛奶
package com.faith.net;

/**
 * 特侖蘇
 */
public class Telunsu implements Milk {
    @Override
    public String getName() {
        return "特侖蘇";
    }
}           
  • 伊利牛奶
package com.faith.net;

/**
 * 伊利
 */
public class Yili implements  Milk {
    @Override
    public String getName() {
        return "伊利";
    }
}           
  • 簡單工廠
package com.faith.net.simple;

import com.faith.net.Mengniu;
import com.faith.net.Milk;
import com.faith.net.Telunsu;
import com.faith.net.Yili;

/**
 * 簡單工廠
 */
public class SimpleFactory {

    public static Milk getMilk(String name){
        if("telunsu".equals(name)){
            return new Telunsu();
        }else if("yili".equals(name)){
            return new Yili();
        }else if("mengniu".equals(name)){
            return new Mengniu();
        }else {
            throw new RuntimeException("wrong request");
        }
    }
}           
  • 用戶端
package com.faith.net.simple;

/**
 * 用戶端
 */
public class SimpleFactoryTest {

    public static void main(String[] args) {
        SimpleFactory.getMilk("telunsu");
    }
}