[英]Which is better way for creating factory class
我已經創建了工廠類,我想知道哪種更好的方法來實現它。 選項1
public class Factory {
private IProperty prop;
public IDoc doc;
public Factory(int version) {
switch (version) {
case '1':
prop = new Prop();
doc = new Docu();
...
case '2':
prop = new Prop1();
doc = new Docu1();
...
}
}
public IProperty getProperty() {
return this.prop;
}
public IDoc getDoc() {
return this.doc;
}
}
我的問題是,是否要像這樣用接口類型定義成員並打開構造函數,或者讓每個get方法在構造函數上使用switch語句,所以在構造函數中,我只會獲取版本並保存它在類成員上,比例如使用
public IProperty getProperty() {
switch (version) {
case '1':
prop = new Prop();
case '2':
prop = new Prop1();
...
那么,更好的方法是什么?
最干凈的方法是將您的工作公開為兩個獨立的工廠,如果它們有任何共享的對象,則為它們提供通用的抽象基礎或可重用的策略參數。 一種工廠類型應僅創建一種特定對象(例如,僅使用塑料工具)。 工廠的公共配置通常僅保留創建對象所需的屬性(供應商的聯系方式,專利)或正在創建的對象的靜態屬性(例如塑料的類型),而不包含對象的類型/類別。
另外,像您的示例#1中那樣存儲長期對象的東西可能應該稱為“上下文”,而不是“工廠”。
下面的代碼示例。
public interface IFactory {
IDoc createDoc();
IProp createProp();
}
public class Type1Factory implements IFactory {
@Override public IDoc createDoc() { return new Doc1(); }
@Override public IProp createProp() { return new Prop1(); }
}
第二種方法總是更好,因為get*
方法的每個調用者都會收到該對象的新實例。 如果在構造函數中創建兩個對象,則必須處理對象共享問題(如果在不同線程中使用這些對象,則還要解決)。
在第一個版本中,創建工廠的想法比第二個版本要好得多。
理想情況下,它不應是工廠類的構造函數,而應是靜態方法。
public class Factory
{
public static IProperty getPropertyObject(char version)
{
switch (version)
{
case '1':
return new Prop();
case '2'
return new Prop1();
}
}
public static IDoc getDocObject(char version)
{
switch (version)
{
case '1':
return new Doc();
case '2'
return new Doc1();
}
}
}
這取決於您的情況。
第一個選項建議您的IProperty
和IDoc
具有不同的版本,但是對於一個版本的每個版本,您都具有另一個版本。
盡管第二種選擇表明這些版本可能彼此獨立。
首先,理想情況下, Factory
應具有static references
而不non-static
static references
。 並且它應該具有static method
來創建/獲取適當的實例。
其次,最好有兩個不同類型的工廠 。
createProperty
,而不是getPropertyObject
,因為該方法不返回已創建的實例,而是返回其創建實例。 當然, getPropertyObject('1')
似乎是從持久性存儲中獲取該版本的property
,而不是它正在做什么。 而是根據版本創建實例。
( 注:- static factory methods
名稱很重要。它們是constructors
優於constructors
的優點之一。由於有了name
,您可以猜測factory method
確切作用)
話雖如此,我想說,所有這些更改都會使2nd option
更好。 讓createProperty
方法決定如何創建instance
。
因此,我將這樣修改您的代碼:-
public class PropertyFactory {
private static IProperty prop;
public static createProperty(char version) {
switch (version) {
case '1':
prop = new Prop();
break; // Don't forget a `break` here.
case '2':
prop = new Prop1();
break;
default: // do have a default case
prop = null;
}
return prop;
}
}
同樣,您可以創建一個DocumentFactory
來創建一個document object
。 命名方法: createDocument(char version)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.