工廠方法模式(一) 簡單工廠模式
定義 定義一個用於創建對象的接口,讓子類去決定實例化哪個類。
在任何需要生成複雜對象的地方呢 都可以使用工廠模式。複雜對象適合使用工廠模式,用new 就
可以完成創建的對象無需使用工廠模式。
我們來看一下使用工廠模式的代碼
//抽象工廠
public abstract class Factory {
/**
* 工廠類的抽象方法 具體生產什麼由子類去實現
* @return
*/
public abstract Product create();
}
//抽象產品類
public abstract class Product {
/**
* 產品類的抽象方法 由具體產品類去實現
*/
public abstract void say();
}
//具體產品A
public class ProductA extends Product {
@Override
public void say() {
System.out.println("我是A");
}
}
//具體產品B
public class ProductB extends Product {
@Override
public void say() {
System.out.println("我是B");
}
}
//具體工廠類A
public class CreateA extends Factory {
@Override
public Product create() {
return new ProductA();
}
}
//具體工廠類B
public class CreateB extends Factory {
@Override
public Product create() {
return new ProductB();
}
}
//客戶類
public class Client {
public static void main(String[] args){
Factory factory = new CreateA();
Product productA = factory.create();
productA.say();
Factory factory1 = new CreateB();
Product product1 = factory1.create();
product1.say();
}
}
這裏的幾個角色都很簡單主要分爲四大模塊 :
(1)抽象工廠 其爲工廠方法模式的核心
(2)具體工廠 其實現了具體的業務邏輯
(3)抽象產品 是工廠方法模式所創建的產品的父類
(4)具體產品 爲實現抽象產品的某個具體產品的對象
上述代碼比較常見,需要生產哪一個就生產哪一個,有時候也可以利用反射的方式更簡潔的來生產具體的產品對象
public abstract class FactoryF {
/**
*
* @param clz 產品對象類類型
* @param <T>
* @return
*/
public abstract <T extends Product> T creat(Class<T> clz); //傳入一個class類來決定是哪一個產品類
}
對於具體的工廠類 通過反射獲取類的實例
public class CreatF extends FactoryF {
@Override
public <T extends Product> T creat(Class<T> clz) {
Product p = null;
try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) p;
}
}
public class Client {
public static void main(String[] args){
FactoryF factoryF = new CreatF();
Product p = factoryF.creat(ProductA.class);
p.say();
Product b = factoryF.creat(ProductB.class);
b.say();
}
}
想生產哪個產品就傳入哪個產品
這種方法比較簡潔 動態 。
像這種方式就是簡單工廠模式或靜態工廠模式 他是工廠模式的一個弱化版本
到這裏可以發現 工廠模式是完全符合設計規則 其降低了對象之間的耦合度。