前面三章中介紹了工廠模式的詳細結構,在實際應用中,我們有時候會要求能夠訪問到具體類的成員,當然這些成員不是抽象類中定義的,而是具體類中特有的,這時候該如何去做呢?先看以下代碼:
//抽象工廠創建者基礎類
//
//
//
public abstract class Creator
{
public abstract CDevice factory(int iIDTemp, string strNameTemp);
}
//抽象工廠,隔離開關設備創建者類
//
//
//
public class SwitchCreator : Creator
{
public override CDevice factory( int iIDTemp, string strNameTemp)
{
return new CSwitch(iIDTemp, strNameTemp);
}
}
//抽象工廠,變壓器設備創建者類
//
//
//
public class TransfCreator : Creator
{
public override CDevice factory(int iIDTemp, string strNameTemp)
{
return new CTransf( iIDTemp, strNameTemp);
}
}
//設備基類
public abstract class CDevice
{
//設備ID
private int iID;
public int ID
{
get
{
return iID;
}
set
{
iID = value;
}
}
//設備名稱
private string strName;
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
//構造函數
public CDevice()
{
}
//加載
public abstract void Load();
//保存
public abstract void Save();
}
//開關類
public class CSwitch : CDevice
{
//開關狀態
private bool bStatue;
public bool Statue
{
get
{
return bStatue;
}
set
{
bStatue = value;
}
}
//構造函數
public CSwitch()
{
}
//構造函數
public CSwitch( int iIDTemp, string strNameTemp)
{
ID = iIDTemp;
Name = strNameTemp;
bStatue=false;
}
//加載
public override void Load()
{
}
//保存
public override void Save()
{
}
}
//變壓器類
public class CTransf : CDevice
{
//變壓器類型
private int iType;
public int Type
{
get
{
return iType;
}
set
{
iType= value;
}
}
//構造函數
public CTransf()
{
}
//構造函數
public CTransf( int iIDTemp, string strNameTemp)
{
ID = iIDTemp;
Name = strNameTemp;
iType=0;
}
//加載
public override void Load()
{
}
//保存
public override void Save()
{
}
}
以上代碼在程序中使用時:(如CSwith類)
Creator m_Creator = new CSwithCreator();
CDevice m_Device = m_Creator.factory( 1, "Swich1");
m_Device .Load();
如需訪問成員ID,則使用如下方式即可:
int iID=m_Device.ID;
但如果要訪問CSwith的bStatue成員時就會訪問不到。我們可以在CDevice基類中引用建立一個CSwith對象成員,然後間接的訪問它,看代碼吧!
//抽象工廠創建者基礎類
//
//
//
public abstract class Creator
{
public abstract CDevice factory(int iIDTemp, string strNameTemp);
}
//抽象工廠,隔離開關設備創建者類
//
//
//
public class SwitchCreator : Creator
{
public override CDevice factory( int iIDTemp, string strNameTemp)
{
return new CSwitch(iIDTemp, strNameTemp);
}
}
//抽象工廠,變壓器設備創建者類
//
//
//
public class TransfCreator : Creator
{
public override CDevice factory(int iIDTemp, string strNameTemp)
{
return new CTransf( iIDTemp, strNameTemp);
}
}
public abstract class CDevice
{
//設備ID
private int iID;
public int ID
{
get
{
return iID;
}
set
{
iID = value;
}
}
//設備名稱
private string strName;
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
//開關類
private CSwitch m_SwitchRef;
public CSwitch SwitchRef
{
get
{
return m_SwitchRef;
}
set
{
m_SwitchRef = value;
}
}
//變壓器類
private CTransf m_TransfRef;
public CTransf TransfRef
{
get
{
return m_TransfRef;
}
set
{
m_TransfRef = value;
}
}
//構造函數
public CDevice()
{
}
//加載
public abstract void Load();
//保存
public abstract void Save();
}
public class CSwitch : CDevice
{
//開關狀態
private bool bStatue;
public bool Statue
{
get
{
return bStatue;
}
set
{
bStatue = value;
}
}
//構造函數
public CSwitch()
{
}
//構造函數
public CSwitch( int iIDTemp, string strNameTemp)
{
SwitchRef = this;
ID = iIDTemp;
Name = strNameTemp;
bStatue=false;
}
//加載
public override void Load()
{
}
//保存
public override void Save()
{
}
}
public class CTransf : CDevice
{
//變壓器類型
private int iType;
public int Type
{
get
{
return iType;
}
set
{
iType= value;
}
}
//構造函數
public CTransf()
{
}
//構造函數
public CTransf( int iIDTemp, string strNameTemp)
{
TransfRef = this;
ID = iIDTemp;
Name = strNameTemp;
iType=0;
}
//加載
public override void Load()
{
}
//保存
public override void Save()
{
}
}
在程序中使用時:
Creator m_Creator = new CSwithCreator();
CDevice m_Device = m_Creator.factory( 1, "Swich1");
bool bStatue=m_Device .SwitchRef.Statue;
這樣就OK了!