1. 程式人生 > >JAVA的23種設計模式---工廠模式

JAVA的23種設計模式---工廠模式

概要:

該文章參考了《設計模式之禪》一書及一些前輩的部落格文章

1.該文章闡述了工廠模式的原理及展示了工廠模式的通用模板;
2.該文章適合初學設計模式的技術人員研習;
3.該文章有許多不足之處,請各位大咖指正,噴子繞道;

正文:

1.基礎工廠模式程式碼實現

抽象產品類

/**
 * 抽象產品類
 * @author Administrator
 *
 */
public interface Product {
    //抽象產品的公共方法1
    public void method1();
    //抽象產品的公共方法2
    public void method2();
}

具體產品類

/**
 * 具體產品類
 * @author Administrator
 *
 */
public class ConcreteProduct implements Product {

    @Override
    public void method1() {
        System.out.println("抽象產品的公共方法1的具體實現");
    }

    @Override
    public void method2() {
        System.out.println("抽象產品的公共方法2的具體實現");
    }

    public
void concreteProductMethod(){ System.out.println("具體產品類中的方法"); } }

抽象工廠類

/**
 * 抽象工廠類
 * @author Administrator
 *
 */
public interface Factory {
    //抽象工廠生產產品的方法
    public ConcreteProduct createProduct(Class<ConcreteProduct> c);
}

具體工廠類

/**
 * 具體工廠類
 * @author Administrator
 *
 */
public class ConcreteFactory implements Factory { @Override public ConcreteProduct createProduct(Class<ConcreteProduct> c) { Product product = null; try { product = (Product)Class.forName(c.getName()).newInstance(); } catch (Exception e) { System.err.println("生產異常"); } return (ConcreteProduct)product; } }

模擬生產-測試類

/**
 * 模擬生產
 * @author Administrator
 *
 */
public class YieldProduct {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        ConcreteProduct product = factory.createProduct(ConcreteProduct.class);
        product.method1();
        product.method2();
        product.concreteProductMethod();
    }
}

控制檯輸出:

抽象產品的公共方法1的具體實現
抽象產品的公共方法2的具體實現
具體產品類中的方法

2.擴充套件—靜態工廠模式

實現:去掉了抽象工廠類,具體工廠類中新增static關鍵字
優點:簡化類建立過程,實用
缺點:不利於工廠的擴充套件

3.擴充套件—多工廠模式

實現及原理:每種產品對應了相應的工廠,每個工廠都獨立負責建立對應的產品物件,增加工廠協調類用來封裝子工廠類,避免呼叫者與各個子工廠交流
優點:符合單一職責原則,職責清晰明確,結構簡單
缺點:降低可擴充套件性和可維護性

4.擴充套件—工廠替代單例模式

單例類:

/**
 * 單例類
 * @author Administrator
 *
 */
public class Singleton{
    //不允許通過new生成物件
    private(){
    }
    //業務處理
    public void doSomthing(){
    }
}

工廠類

/**
 * 工廠類
 * @author Administrator
 *
 */
public class SingletonFactory(){
    private static Singleton singleton;
    static{
        try{
            //反射獲取類
            Class c = Class.forName(Singleton.class.getName());
            //獲得無參構造
            Constructor constructor = c.getDeclaredConstructor();
            //設定無參構造是可以訪問的
            constructor.setAccessible(true);
            //產生一個例項物件
            singleton = (Singleton)constructor.newInstance();
        }catch(Exception e){
            System.err.println("單例生產錯誤");
        }
    }
    //獲取該例項物件
    public static Singleton getSingleton(){
        return singleton;
    }
}

注:
a:使用工廠模式來產生單例物件
b:關於單例模式的反射及反序列化漏洞詳請參看單例模式中的介紹

5.擴充套件—延遲初始化

工廠類

/**
 * 工廠類
 * @author Administrator
 *
 */
public class ProductFactory{
    //通過HashMap產生快取,對用到的物件進行保留
    private static final Map<String,Product> prMap = new HashMap();
    public static synchronized Product createProduct(String type) throws Exception{
        Product product = null;
        //如果物件已經存在於prMap中
        if(prMap.containsKey(type)){
            product = prMap.get(type);
        }else{
            product = new ConcreteProduct();
            prMap.put(type,product);
        }
        return product;
    }
}

注:一個物件被使用完畢後,並不立刻釋放,工廠類保持其初始狀態,等待再次利用,通過HashMap來實現