gpt4 book ai didi

c# - 抽象工厂模式——具体工厂的要点

转载 作者:太空狗 更新时间:2023-10-29 22:23:36 24 4
gpt4 key购买 nike

这是我通常看到的抽象工厂模式的方式:

public abstract class Factory 
{
public abstract Product GetProduct();
}

public class ConcreteFactory1 : Factory
{
public override Product GetProduct() { return new Product1(); }
}

class ConcreteFactory2 : Factory
{
public override Product GetProduct() { return new Product2(); }
}

interface Product
{
void SomeMethod();
}

class Product1 : Product
{
public void SomeMethod() { Console.WriteLine("1"); }
}

class Product2 : Product
{
public void SomeMethod() { Console.WriteLine("2"); }
}

class Program
{
static void Main(string[] args)
{
Factory f = null;
Product p = null;
switch (args[0])
{
case "1":
f = new ConcreteFactory1();
p = f.GetProduct();
break;
case "2":
f = new ConcreteFactory2();
p = f.GetProduct();
break;
}
p.SomeMethod();
}
}

我通常这样写,这不是真正的模式:

interface Product 
{
void SomeMethod();
}
class Product1 : Product
{
public void SomeMethod() { Console.WriteLine("1"); }
}
class Product2 : Product
{
public void SomeMethod() { Console.WriteLine("2"); }
}
public static class Factory
{
public static Product GetProduct(prodType)
{
Product p = null;
switch (prodType)
{
case "1":
p = new Product1();
break;
case "2":
p = new Product2();
break;
}
return p;
}
}

class Program
{
static void Main(string[] args)
{
Product p = Factory.GetProduct(args[0]);
p.SomeMethod();
}
}

我的问题是 - 混凝土工厂的优势是什么?我一直不明白这一点——它似乎只是增加了另一个不必要的层。第二个例子看起来更简洁明了。

最佳答案

既然 Odrade 同意我的观点(我想我还没有完全失去理智),我会把这个作为答案发布:

我认为,如果我弄错了请更正我,通常您的基本级别代码没有所使用的具体工厂的概念。也不关心通过 prodType 指定(在您的情况下)产品类型。相反,具体的工厂实现通过某种形式的依赖注入(inject)提供给您的抽象工厂,并且您的代码在没有任何关于正在使用什么工厂或所需的具体类型的概念的情况下继续其快乐的方式。特别是如果那些具体的工厂实现是由您的 API 的第 3 方消费者提供的。

关于它的维基百科文章提供了一个关于操作系统 GUI 构建的不错示例:http://en.wikipedia.org/wiki/Abstract_factory_pattern#C.23

本质上,您的库中的代码可以正常运行,而无需了解任何实现细节或对所用操作系统的依赖性。当您(或您的 API 的使用者)迁移到 Linux 时(在此维基百科示例中),您只需实现 LinuxFactoryLinuxButton 并将其提供给您的 API .如果相反,就像在您的典型示例中一样,您通过输入(例如枚举)控制它,那么您的工厂需要了解 Linux:

public static class Factory 
{
public static Button GetButton(operatingSystem)
{
switch (operatingSystem)
{
case "windows":
return new WindowsButton();
case "macintosh":
return new MacButton();
}
}
}

Linux 现在是如何被考虑在内的?嗯,除非 添加支持,否则它不能。此外,现在您的 API 的所有使用者都间接依赖于所有操作系统的实现。

编辑:请注意,工厂模式抽象工厂模式 是两个完全不同的概念。关于您首先问这个问题的原因,抽象工厂模式并不总是必要的。如果你不需要一个,那就不要增加一个的复杂性。如果你只需要一个简单的工厂(你的第二个例子是它的一个变体)那么使用它。正确的工具适合正确的工作等等。

关于c# - 抽象工厂模式——具体工厂的要点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11147401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com