簡體   English   中英

這是創建工廠類的更好方法

[英]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();
        }
    }
}

這取決於您的情況。

第一個選項建議您的IPropertyIDoc具有不同的版本,但是對於一個版本的每個版本,您都具有另一個版本。

盡管第二種選擇表明這些版本可能彼此獨立。

  • 首先,理想情況下, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM