設計模式之工廠方法模式

工廠方法模式使用的頻率非常高,在我們的日常開發中總能見到,也許你一直在使用但是卻不知道其實他的名字叫工廠方法模式。


工廠方法模式的定義如下:

定義一個用於創建對象的接口,讓子類決定實例化哪一個類。


工廠方法的通用類圖如下:



 

工廠方法模式的通用代碼如下:


public abstract class Creator {

    public abstract <T extends Product> T factoryMethod(Class<T> c);
}

public class ConcreteCreator extends Creator {

    /**
     * @param c
     * @return
     */
    @Override
    public <T extends Product> T factoryMethod(Class<T> c) {
        Product product=null;
        
        try {
            product=(Product) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch blockd
            e.printStackTrace();
        } 
        
        return (T) product;
    }

}

public abstract class Product {

    // 公共方法
    public void sameMethod() {

     
    }

    public abstract void doSomething();
}

public class ConcreteProduct extends Product {

    /**
     * 
     * @see com.huashao.chapter.chapter08.Product#doSomething()
     */
    @Override
    public void doSomething() {

        System.out.println("具體業務邏輯");
    }

}

看完通用類圖和通用代碼之後,不知道大家會不會想起自己的代碼是否有用過的此模式的地方


工廠模式的優點:

  1. 良好的封裝性
  2. 靈活的擴展性
  3. 屏蔽產品類(產品類的實現如何變化,調用者都不需要關心,它只關心產品的接口,只要接口不變,系統中的高層模塊就不需要改變)  


具體應用之汽車生產


public abstract class AbstractCar {

    // 每個汽車都能跑
    protected abstract void run();
}

public class BenzCar extends AbstractCar {


    /**
     * 
     * @see com.huashao.chapter.chapter08.AbstractCar#run()
     */
    @Override
    protected void run() {

        System.out.println("奔馳生產成功");
    }

}

public abstract class AbstractCarFactory {

    // 生產汽車
    protected abstract <T extends AbstractCar> T createCar(Class<T> c);
}

public class CarFactory extends AbstractCarFactory {

    /**
     * 生產汽車
     * 
     * @param c
     * @return
     */
    @Override
    protected <T extends AbstractCar> T createCar(Class<T> c) {

        AbstractCar car = null;

        try {
            car = (T) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("生產汽車時發生異常:" + e.getMessage());
        }

        return (T) car;
    }

}


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