C#簡單工廠模式——初遇GoF設計模式


---無聊的分割線---

在面向對象程序中,我們經常看到一種模式就是簡單工廠模式(Simple Factory Pattern)。也許你也沒意識到原來你一直在使用簡單工廠模式,沒關系,很多時候我們往往只需要使用就可以了。

簡單工廠模式根據提供給它的數據,返回幾個可能類中的一個類的實例。通常它返回的類都有一個共同的父類和共同的方法,但每個方法執行的任務不同,而且根據不同的數據進行了優化。簡單工廠模式實際上不屬於23個GoF模式,但它可以作為學習工廠方法模式的一個引導。


 

1.先定義一個父類

//父類
public class Namer {
    //再次定義成員
   protected string frName, lName;

    //返回fName
    public string getFrname(){
        return frName;
    }

    //返回lName
    public string getLname(){
        return lName;
    }
}

2.定義兩個子派生類

兩個派生類繼承了Namer。並且兩個類的構造函數都將name分成兩部分。並且約定,最后一個空格后面所有的內容都屬於frName。在子類1當中,分割符是空格,在子類2當中,分隔符是逗號。

//子類1 
public class FirstLast : Namer {
    public FirstLast(String name){
        int i=name.Trim().IndexOf(" ");
        if(i>0){
            frName=name.Substring(0,i).Trim();
            lName=name.Substring(i+1).Trim();            
        }
        else{
            lName=name;
            frName="";
        }
    }
}

//子類2
public class LastFirst : Namer {
    public LastFirst(string name){
        int i=name.IndexOf(",");
        if(i>0){
            lName=name.Substring(0,i);
            frName=name.Substring(i+1).Trin();
        }
        else{
            lName=name;
            frName="";
        }
    }
}

 這兩種情況下,我們將分拆的name保存在基類Namer中的保護變量lName和frName里。

 


3.構造簡單工廠

類已經准備好了,下面就需要構造一個簡單工廠。工廠做的事情很簡單,當檢測到name里面有逗號時,返回一個LastFirst對象,否則返回FirstLast對象。下面是代碼示例:

//簡單工廠
public class NameFactory{
    //構造函數
    public NameFactory{}
    
    //根據判斷返回不同的類
    public Namer getName(string name){
        int i=name.IndexOf(",");
        if(i>0){
            return new LastFirst(name);
        }else{
            return new FirstLast(name);
        }
    }
}

 


4.使用工廠

假設一個輸入文本要求輸入姓名,響應button Click事件之后將姓和名分別輸入在對於的文本框。下面是代碼示例:

//使用工廠
private void btnOK_Click(object sender,System.EventArgs e){
    Namer nm=nameFact.geyName(txtName.Text);
    txtFirst.Text=nm.getFrname();
    txtLast.Text=nm.getLname();
}

在使用的時候,我們不需要知道使用的是哪一個派生類,工廠會為我們做出選擇。

 


結構圖示

 

 


小結

簡單工廠能夠返回具有相同方法的類的實例,他們可以是不同的派生子類的實例,也可以是實踐上毫無關系僅僅是共享了相同接口的類。不管是哪一種形式,這些實例中的方法必須是相同的,並且能夠被交替使用。

學習,從簡單開始。

所有代碼

簡單工廠
//父類
public class Namer {
    //再次定義成員
   protected string frName, lName;

    //返回fName
    public string getFrname(){
        return frName;
    }

    //返回lName
    public string getLname(){
        return lName;
    }
}

//子類1 
public class FirstLast : Namer {
    public FirstLast(String name){
        int i=name.Trim().IndexOf(" ");
        if(i>0){
            frName=name.Substring(0,i).Trim();
            lName=name.Substring(i+1).Trim();            
        }
        else{
            lName=name;
            frName="";
        }
    }
}

//子類2
public class LastFirst : Namer {
    public LastFirst(string name){
        int i=name.IndexOf(",");
        if(i>0){
            lName=name.Substring(0,i);
            frName=name.Substring(i+1).Trin();
        }
        else{
            lName=name;
            frName="";
        }
    }
}

//簡單工廠
public class NameFactory{
    //構造函數
    public NameFactory{}
    
    //根據判斷返回不同的類
    public Namer getName(string name){
        int i=name.IndexOf(",");
        if(i>0){
            return new LastFirst(name);
        }else{
            return new FirstLast(name);
        }
    }
}

//使用工廠
private void btnOK_Click(object sender,System.EventArgs e){
    Namer nm=nameFact.geyName(txtName.Text);
    txtFirst.Text=nm.getFrname();
    txtLast.Text=nm.getLname();
}

 


參考資料:《C#設計模式》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM