抽象工厂设计模式是一种创建模式,它提供了一个接口,用于创建相关或依赖对象的族,而无需指定其具体类。在需要创建由通用主题相关但实现不同的对象的情况下,它特别有用。
Abstract Factory Pattern 允许您创建可以创建其他工厂的超级工厂。这个超级工厂也被称为工厂中的工厂。使用抽象工厂模式的主要优点是它将客户端代码与创建的对象的具体类隔离开来,从而产生更加解耦和可维护的代码。
真实世界的例子:
首先,我们为工厂将创建的产品 (设备) 定义接口。
IDevice.cs
public interface IDevice
{
void GetDetails();
}
接下来,我们创建具体的类,为每种类型的设备和公司实现这些产品接口。
联想设备
public class LenovoMobile : IDevice
{
public void GetDetails()
{
Console.WriteLine("Lenovo Mobile");
}
}
public class LenovoLaptop : IDevice
{
public void GetDetails()
{
Console.WriteLine("Lenovo Laptop");
}
}
public class LenovoDesktop : IDevice
{
public void GetDetails()
{
Console.WriteLine("Lenovo Desktop");
}
}
HP 设备
public class HPMobile : IDevice
{
public void GetDetails()
{
Console.WriteLine("HP Mobile");
}
}
public class HPLaptop : IDevice
{
public void GetDetails()
{
Console.WriteLine("HP Laptop");
}
}
public class HPDesktop : IDevice
{
public void GetDetails()
{
Console.WriteLine("HP Desktop");
}
}
IBM 设备
public class IBMMobile : IDevice
{
public void GetDetails()
{
Console.WriteLine("IBM Mobile");
}
}
public class IBMLaptop : IDevice
{
public void GetDetails()
{
Console.WriteLine("IBM Laptop");
}
}
public class IBMDesktop : IDevice
{
public void GetDetails()
{
Console.WriteLine("IBM Desktop");
}
}
Apple 设备
public class AppleMobile : IDevice
{
public void GetDetails()
{
Console.WriteLine("Apple Mobile");
}
}
public class AppleLaptop : IDevice
{
public void GetDetails()
{
Console.WriteLine("Apple Laptop");
}
}
public class AppleDesktop : IDevice
{
public void GetDetails()
{
Console.WriteLine("Apple Desktop");
}
}
我们为抽象工厂定义了一个接口,该接口将创建相关产品。
IDeviceFactory.cs。
public interface IDeviceFactory
{
IDevice CreateMobile();
IDevice CreateLaptop();
IDevice CreateDesktop();
}
我们创建实现抽象工厂接口的具体工厂,并为每个公司创建特定的产品。
LenovoFactory.cs
public class LenovoFactory : IDeviceFactory
{
public IDevice CreateMobile()
{
return new LenovoMobile();
}
public IDevice CreateLaptop()
{
return new LenovoLaptop();
}
public IDevice CreateDesktop()
{
return new LenovoDesktop();
}
}
HPFactory.cs
public class HPFactory : IDeviceFactory
{
public IDevice CreateMobile()
{
return new HPMobile();
}
public IDevice CreateLaptop()
{
return new HPLaptop();
}
public IDevice CreateDesktop()
{
return new HPDesktop();
}
}
IBMFactory.cs
public class IBMFactory : IDeviceFactory
{
public IDevice CreateMobile()
{
return new IBMMobile();
}
public IDevice CreateLaptop()
{
return new IBMLaptop();
}
public IDevice CreateDesktop()
{
return new IBMDesktop();
}
}
AppleFactory.cs
public class AppleFactory : IDeviceFactory
{
public IDevice CreateMobile()
{
return new AppleMobile();
}
public IDevice CreateLaptop()
{
return new AppleLaptop();
}
public IDevice CreateDesktop()
{
return new AppleDesktop();
}
}
最后,我们在客户端代码中使用抽象工厂来创建产品,而无需指定它们的具体类。
Program.cs
using System;
class Program
{
static void Main(string[] args)
{
// Create a Lenovo factory
IDeviceFactory lenovoFactory = new LenovoFactory();
IDevice lenovoMobile = lenovoFactory.CreateMobile();
IDevice lenovoLaptop = lenovoFactory.CreateLaptop();
IDevice lenovoDesktop = lenovoFactory.CreateDesktop();
lenovoMobile.GetDetails();
lenovoLaptop.GetDetails();
lenovoDesktop.GetDetails();
// Create an HP factory
IDeviceFactory hpFactory = new HPFactory();
IDevice hpMobile = hpFactory.CreateMobile();
IDevice hpLaptop = hpFactory.CreateLaptop();
IDevice hpDesktop = hpFactory.CreateDesktop();
hpMobile.GetDetails();
hpLaptop.GetDetails();
hpDesktop.GetDetails();
// Create an IBM factory
IDeviceFactory ibmFactory = new IBMFactory();
IDevice ibmMobile = ibmFactory.CreateMobile();
IDevice ibmLaptop = ibmFactory.CreateLaptop();
IDevice ibmDesktop = ibmFactory.CreateDesktop();
ibmMobile.GetDetails();
ibmLaptop.GetDetails();
ibmDesktop.GetDetails();
// Create an Apple factory
IDeviceFactory appleFactory = new AppleFactory();
IDevice appleMobile = appleFactory.CreateMobile();
IDevice appleLaptop = appleFactory.CreateLaptop();
IDevice appleDesktop = appleFactory.CreateDesktop();
appleMobile.GetDetails();
appleLaptop.GetDetails();
appleDesktop.GetDetails();
}
}
项目的文件夹结构应如下所示:
AbstractFactoryExample
│
├── IDevice.cs
├── LenovoMobile.cs
├── LenovoLaptop.cs
├── LenovoDesktop.cs
├── HPMobile.cs
├── HPLaptop.cs
├── HPDesktop.cs
├── IBMMobile.cs
├── IBMLaptop.cs
├── IBMDesktop.cs
├── AppleMobile.cs
├── AppleLaptop.cs
├── AppleDesktop.cs
├── IDeviceFactory.cs
├── LenovoFactory.cs
├── HPFactory.cs
├── IBMFactory.cs
├── AppleFactory.cs
└── Program.cs
要运行该程序,请执行以下步骤:
您应该会看到输出:
Lenovo Mobile
Lenovo Laptop
Lenovo Desktop
HP Mobile
HP Laptop
HP Desktop
IBM Mobile
IBM Laptop
IBM Desktop
Apple Mobile
Apple Laptop
Apple Desktop
抽象工厂模式是一个强大的工具,用于创建相关对象的族,而无需指定其具体类。它促进了产品之间的一致性,并将客户端代码与具体实现分离,使您的代码库更具可维护性和可扩展性。