JAVA的23種設計模式---工廠模式
阿新 • • 發佈:2019-02-16
概要:
該文章參考了《設計模式之禪》一書及一些前輩的部落格文章
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來實現