1. 程式人生 > >java常用設計模式3——工廠方法模式

java常用設計模式3——工廠方法模式

1、工廠方法模式定義:定義一個用於建立物件的介面,讓子類決定例項化哪個類
2、工廠方法模式的使用場景:在任何需要生成複雜物件的地方,都可以使用工廠方法模式。複雜物件適合使用工廠模式,用new就可以完成建立的物件無需使用工廠模式

多工廠方法模式

程式碼示例:
1、定義一個抽象的產品介面(非必須)

/**
 * 抽象的產品介面
 */
public abstract class Product {
    /**
     * 產品類的抽象方法,由具體的產品類去實現
     */
    public abstract void productName();

}

2、具體的產品實現類

public class ProductA extends Product {
    @Override
    public void productName() {
        Log.i("LHD", "這是A產品");
    }
}
public class ProductB extends Product {
    @Override
    public void productName() {
        Log.i("LHD", "這是B產品");
    }
}

3、抽象工廠類

/**
 * 抽象的工廠介面
 */
public abstract class
Factory { /** * 抽象工廠方法,具體生產什麼由子類去實現 */ public abstract Product createProduct(); }

4、具體工廠類

/**
 * A產品的工廠
 */
public class FactoryA extends Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
/**
 * B產品的工廠
 */
public class FactoryB extends
Factory { @Override public Product createProduct() { return new ProductB(); } }

使用:

                Factory factory = new FactoryA();
                Product p = factory.createProduct();
                p.productName();

這種方式很常見,每個產品都有自己的工廠方法,他們實現了同樣的工廠介面,需要哪個產品就使用哪個工廠,像這種擁有多個工廠的方式稱為多工廠方法模式。

簡單工廠(靜態工廠)模式

當然我們可以有更簡潔的方式,我們可以簡化成一個工廠,並去掉介面,然後給工廠類傳入一個引數,並根據引數來決定生產哪個,程式碼修改如下:

去掉介面,傳入一個類引數,來決定生產哪個產品

/**
 * 使用反射來根據引數建立物件
 */
public class CreateProductFactory {
    public <T extends Product> T createProduct(Class<T> clz) {
        Product p = null;
        try {
            p = (Product) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) p;
    }
}

使用:

                CreateProductFactory factory = new CreateProductFactory();//由於去掉了Factory,所以需要例項化具體的工廠物件
                Product p = factory.createProduct(ProductA.class);//傳入ProductA.class則生產A產品
                //Product p = factory.createProduct(ProductB.class);//傳入ProductA.class則生產B產品
                p.productName();

像這樣的只有一個工廠的方式稱為簡單工廠模式或靜態工廠模式,它是工廠方法模式的一個弱化版本。

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

另外還有一個抽象工廠模式,具體沒怎麼用過,就不做介紹啦。

以上就是工廠方法模式的簡單介紹啦(#^ . ^#)