想要检查这是否代表抽象工厂模式的一个好例子。 这里是主题 戴尔(厂)使得XPS(产品) 戴尔(厂),使的Inspiron(产品) 马力(厂)做特使(产品) 马力(厂)使得Presario自由人(产品)这是表示抽象工厂模式的一个很好的例子
百思买销售电脑。
//Abstract factory
abstract class ComputerFactory
{
public abstract Computer BuildComputer(Computer.ComputerType compType);
}
//Concrete factory
class Dell : ComputerFactory
{
public override Computer BuildComputer(Computer.ComputerType compType)
{
if (compType == Computer.ComputerType.xps)
return (new xps());
else if (compType == Computer.ComputerType.inspiron)
return new inspiron();
else
return null;
}
}
//Concrete factory
class Hp : ComputerFactory
{
public override Computer BuildComputer(Computer.ComputerType compType)
{
if (compType == Computer.ComputerType.envoy)
return (new envoy());
else if (compType == Computer.ComputerType.presario)
return new presario();
else
return null;
}
}
//Abstract product
public abstract class Computer
{
public abstract string Mhz { get; set; }
public enum ComputerType
{
xps,
inspiron,
envoy,
presario
}
}
//Concrete product for DELL
public class xps : Computer
{
string _mhz = string.Empty;
public override string Mhz
{
get
{
return _mhz;
}
set
{
_mhz = value;
}
}
}
//Concrete product for DELL
public class inspiron : Computer
{
string _mhz = string.Empty;
public override string Mhz
{
get
{
return _mhz;
}
set
{
_mhz = value;
}
}
}
//Concrete product for HP
public class envoy : Computer
{
string _mhz = string.Empty;
public override string Mhz
{
get
{
return _mhz;
}
set
{
_mhz = value;
}
}
}
//Concrete product for HP
public class presario : Computer
{
string _mhz = string.Empty;
public override string Mhz
{
get
{
return _mhz;
}
set
{
_mhz = value;
}
}
}
public class BestBuy
{
ComputerFactory compFactory;
Computer comp;
public BestBuy(Computer.ComputerType compType)
{
if (compType == Computer.ComputerType.xps || compType == Computer.ComputerType.inspiron)
compFactory = new Dell();
else
compFactory = new Hp();
comp = compFactory.BuildComputer(compType);
}
public Computer Sell()
{
return comp;
}
}
在此先感谢。
嗨,我已经添加了客户端类为好。我理解你对使用computertype作为枚举的担心。谢谢 – saidevakumar 2011-02-24 19:55:30
@saidevakumar:这显示了问题。 “百思买”需要提前了解每种潜在的电脑类型。说戴尔现在除了他们的两条线外还有一台“XPQ”电脑。您必须更改API,更改客户代码等。如果您想添加第三个品牌,则必须将其添加到枚举中。通过让工厂提供他们可以创建的类型,您可以消除这种需求...... – 2011-02-24 20:09:04
更糟糕的是,如果两个电脑制造商推出了同名的型号,该怎么办? – MattDavey 2011-06-07 08:10:44