前面三章中介绍了工厂模式的详细结构,在实际应用中,我们有时候会要求能够访问到具体类的成员,当然这些成员不是抽象类中定义的,而是具体类中特有的,这时候该如何去做呢?先看以下代码:
//抽象工厂创建者基础类
//
//
//
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了!