我想看看这是不是一个表示抽象工厂模式的好例子。主题是戴尔(工厂)制造xps (产品)戴尔(工厂)制造inspiron灵越(产品) hp (工厂)制造特使(产品) hp (工厂)制造presario (产品)
BestBuy销售电脑。
//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;
}
}提前谢谢。
发布于 2011-02-25 03:12:30
这是该模式各部分的一个很好的例子。对象的基本结构是一个很好的例子,然而,逻辑依赖于单个Computer.ComputerType枚举。这个枚举需要提前知道每个工厂公开的每一种类型的计算机。
通常,使用抽象工厂的动机是将这种类型的硬编码需求从图片中抽象出来。与其只有一个枚举,不如添加一个ComputerType类,并允许工厂返回可用类型的集合。然后,您可以使用返回的ComputerType来构造新系统。
这允许您在不更改API的情况下添加其他工厂,这是抽象工厂模式的主要优势之一。阅读Abstract Factory Pattern -其中一个要点是:
客户端并不知道(或关心)它从每个内部工厂获得了哪些具体对象,因为它只使用其产品的通用接口。
在本例中,您正在将已知类型“硬编码”到枚举中,这违反了模式的这一部分。
发布于 2011-02-25 03:16:35
我不是工厂模式专家,但这里有几件事我会用不同的方式去做:
接口而不是抽象类,我将使用
发布于 2012-07-05 19:02:57
我认为,在您提供的场景和代码中,只有一种类型的产品,即“计算机”。不涉及任何产品系列。因此,抽象工厂模式在这里不适用。相反,这里可以使用工厂模式。为了理解,我修改了下面的代码。
//Abstract factory
abstract class ComputerFactory
{
public abstract Computer BuildComputer(Computer.ComputerType compType);
}
public class ConcreteFactory : 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 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
{
ConcreteFactory compFactory;
Computer comp;
public BestBuy(Computer.ComputerType compType)
{
comp = compFactory.BuildComputer(compType);
}
public Computer Sell()
{
return comp;
}
}https://stackoverflow.com/questions/5109093
复制相似问题