首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是表示抽象工厂模式的好例子吗?

这是表示抽象工厂模式的好例子吗?
EN

Stack Overflow用户
提问于 2011-02-25 02:50:54
回答 3查看 2.5K关注 0票数 6

我想看看这是不是一个表示抽象工厂模式的好例子。主题是戴尔(工厂)制造xps (产品)戴尔(工厂)制造inspiron灵越(产品) hp (工厂)制造特使(产品) hp (工厂)制造presario (产品)

BestBuy销售电脑。

代码语言:javascript
复制
//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;
    }
}

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-25 03:12:30

这是该模式各部分的一个很好的例子。对象的基本结构是一个很好的例子,然而,逻辑依赖于单个Computer.ComputerType枚举。这个枚举需要提前知道每个工厂公开的每一种类型的计算机。

通常,使用抽象工厂的动机是将这种类型的硬编码需求从图片中抽象出来。与其只有一个枚举,不如添加一个ComputerType类,并允许工厂返回可用类型的集合。然后,您可以使用返回的ComputerType来构造新系统。

这允许您在不更改API的情况下添加其他工厂,这是抽象工厂模式的主要优势之一。阅读Abstract Factory Pattern -其中一个要点是:

客户端并不知道(或关心)它从每个内部工厂获得了哪些具体对象,因为它只使用其产品的通用接口。

在本例中,您正在将已知类型“硬编码”到枚举中,这违反了模式的这一部分。

票数 8
EN

Stack Overflow用户

发布于 2011-02-25 03:16:35

我不是工厂模式专家,但这里有几件事我会用不同的方式去做:

接口而不是抽象类,我将使用

  • 我会使用接口而不是抽象类。 因此,如果“Dell”需要从另一个类继承,它可以并且仍然可以通过实现 IComputerFactory 成为 ComputerFactory。
  • 另一件小事是在 BuildComputer 函数中使用“开关”而不是“if/else if”。 谁知道你最终可能会拥有多少台计算机。
  • 您如何知道在惠普和戴尔之间使用哪个具体工厂? 您可能会使用 "Autofac"之类的东西来“解决”要使用的工厂。
票数 3
EN

Stack Overflow用户

发布于 2012-07-05 19:02:57

我认为,在您提供的场景和代码中,只有一种类型的产品,即“计算机”。不涉及任何产品系列。因此,抽象工厂模式在这里不适用。相反,这里可以使用工厂模式。为了理解,我修改了下面的代码。

代码语言:javascript
复制
//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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5109093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档