先看乙個例子:
抽象產品類
public
abstract
class product
具體產品類a
public
class
concreteproducta
extends
product
}
具體產品類b
public
class
concreteproductb
extends
product
}
方式一
抽象工廠類
public
abstract
class factory;
}
具體工廠類a
public
class
concretefactory
extends
factory
}
客戶類
public
class client
}
理解:
首先是定義兩個抽象類:生產抽象類和工廠抽象類,前者由子類繼承,實現具體子類所要生產的方法,後者由具體工廠實現,具體工廠決定自己要實現那個產品,之間的聯絡,是由抽象工廠類的createproduct方法建立的,這個方法返回的是produce型別,意味著可以通過createproduct得到product物件,從而建立產品.
這裡我們得到的是concreteproducta的例項,如果我們想得到concreteproductb的例項,則只需要改一下即可:
public
class
concretefactory
extends
factory
}
方式二
利用反射的方式
//抽象的工廠類
public
abstract
class
factory
//具體的工廠類
public
class
concretefactory
extends
factory
catch(exception e)
return (t)p;
}}
//client的實現
public
class client
}
來看個工廠模式的實戰:
public
abstract classiohandler
filehandler
public
class
filehandler
extends
iohandler
@override
public
void
remove(string id)
@override
public
void
update(string id,string name)
@override
public
void
query(string id)
//..
}
xmlhandler
public
class
xmlhandler
extends
iohandler
@override
public
void
remove(string id)
@override
public
void
update(string id,string name)
@override
public
void
query(string id)
//..
}
dbhandler
public
class
dbhandler
extends
iohandler
@override
public
void
remove(string id)
@override
public
void
update(string id,string name)
@override
public
void
query(string id)
//..
}
工廠類的定義
public
class iofactory
catch(exception e)
return t handler;
}}
最後在activity中從不同資料檔案中查詢得到的資料展示在乙個textview
public
class
factoryactivity
extends
activity
});btnxml.setonclicklistener(new view.onclicklistener()
});b***b.setonclicklistener(new view.onclicklistener()
});}
}
優點:降低物件的耦合,很好的擴充套件性
缺點:每次加入乙個新產品就需要乙個抽象類,新產品類和具體工廠類
設計模式之工廠設計模式筆記
定義 在基類中定義建立物件的乙個介面,讓子類決定例項化哪個類。工廠方法讓乙個類的的例項化延遲到子類中進行。為什麼要用工廠模式?適用場景 需要建立的物件較少。客戶端不關心物件的建立過程。簡單工廠例項public abstract class animal class catextends animal...
設計模式筆記之工廠模式
概念 工廠模式屬於建立型模式。定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。示例 定義乙個介面 public inte ce shape 介面的第乙個實現類 public class rectangle implements shape 介面的第二個...
《head first》設計模式之四 工廠模式
工廠模式一章講了很多內容,但是設計思想是一致的 1 變數不可以持有具體類的引用 如果使用new 就會持有具體類的引用,可以用工廠類避開 2 不要讓類派生自具體類 如果派生自具體類,那就是依賴具體的實現類,彈性差,請派生自抽象類或者介面 3 不要覆蓋基類中已實現的方法 如果覆蓋基類已實現的方法,那基類...