抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式。
目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法)。
使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
实现:在一个工厂里聚合多个同类产品。
案例
上一个工厂方法模式的案例是 一家生产电子产品的工厂,可以生产各种电子产品,但是这时候集团还拥有一家生产服装的工厂,
怎么能把这两个工厂给管理起来,其实把公产管理起来这样更加有助于去理解业务中的类的组织管理,不至于混乱不清晰。
namespace DesignPatterns.AbstractFactory
{
/// <summary>
/// 抽象工厂
/// </summary>
public abstract class AbstractFactory
{
public virtual ElectronicProduct GetElectronicProduct(string name)
{
throw new NullReferenceException();
}
public virtual CarProduct GetCarProduct(string name)
{
throw new NullReferenceException();
}
}
/// <summary>
/// 抽象工厂生成器,抽象工厂的调用入口
/// </summary>
public class FactoryProducer
{
/// <summary>
/// 根据名称获取子类工厂的实例
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static AbstractFactory GetFactory(string name)
{
if (name.ToLower() == "car")
return new CarFactory();
if (name.ToLower() == "electronic")
return new ElectronicFactory();
return null;
}
}
#region 子类工厂 实现抽象工厂的方法
public class CarFactory : AbstractFactory
{
public override CarProduct GetCarProduct(string name)
{
if (name.ToLower() == "motorbike")
return new Motorbike();
if (name.ToLower() == "xpandrally")
return new XpandRally();
throw new Exception("unknow product name");
}
}
public class ElectronicFactory : AbstractFactory
{
public override ElectronicProduct GetElectronicProduct(string name)
{
if (name.ToLower() == "tv")
return new TV();
if (name.ToLower() == "mp4")
return new MP4();
if (name.ToLower() == "mp3")
return new MP3();
throw new Exception("unknow product name");
}
}
#endregion
#region 子类工厂的产品
public abstract class CarProduct
{
public abstract void Run();
}
public class Motorbike : CarProduct
{
public override void Run()
{
Console.WriteLine("摩托车");
}
}
public class XpandRally : CarProduct
{
public override void Run()
{
Console.WriteLine("拉力赛车");
}
}
public abstract class ElectronicProduct
{
public abstract void Play();
}
public class TV : ElectronicProduct
{
public override void Play()
{
Console.WriteLine("TV play");
}
}
public class MP4 : ElectronicProduct
{
public override void Play()
{
Console.WriteLine("MP4 play");
}
}
public class MP3 : ElectronicProduct
{
public override void Play()
{
Console.WriteLine("MP3 play");
}
}
#endregion
public class AbstractFactoryTest
{
public static void Test()
{
//实例化造车工厂
AbstractFactory carFactory = FactoryProducer.GetFactory("car");
//获取摩托车实例
var motorbike = carFactory.GetCarProduct("motorbike");
//执行实例方法
motorbike.Run();
//实例化电子厂
AbstractFactory electronicFactory = FactoryProducer.GetFactory("electronic");
//获取tv实例
var tv = electronicFactory.GetElectronicProduct("tv");
tv.Play();
}
}
}