抽象工厂模式 –产品族的创建
抽线工厂模式的定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。和工厂方法模式不同的地方在于抽象工厂模式是提供了创建一系列类的实例的工厂方法。
还是拿制造汽车来举例子:某汽车公司要制造两款汽车,一款是Mini,一款是Suv,如果利用工厂方法模式来建模的话,可以想象要创建成倍增长的类,显然不适合,那么,我们可以用抽象工厂模式来创建:
namespace AbstractFactoryModel
{
class Program
{
static void Main(string[] args)
{
IFactory miniFactory=new MiniFactory();
IFactory suvFactory=new SuvFactory();
miniFactory.CreateTyre();
miniFactory.CreateWindow();
suvFactory.CreateTyre();
suvFactory.CreateWindow();
Console.ReadKey();
}
}
public interface IFactory//创建工厂模型
{
ITyre CreateTyre();
IWindow CreateWindow();
}
public interface ITyre//创建轮胎模型
{
void Message();
}
public interface IWindow//创建车窗模型
{
void Message();
}
public class MiniFactory : IFactory//创建mini汽车的工厂类
{
public ITyre CreateTyre()
{
return new MiniTyre();
}
public IWindow CreateWindow()
{
return new MiniWindow();
}
}
public class SuvFactory:IFactory//创建suv汽车的工厂类
{
public ITyre CreateTyre()
{
return new SuvTyre();
}
public IWindow CreateWindow()
{
return new SuvWindow();
}
}
public class MiniTyre : ITyre//创建mini汽车的轮胎
{
public void Message()
{
Console.WriteLine("Create a Mini-Tyre");
}
}
public class MiniWindow : IWindow//创建mini汽车的车窗
{
public void Message()
{
Console.WriteLine("Create Mini-Window");
}
}
public class SuvTyre : ITyre//创建suv汽车的轮胎
{
public void Message()
{
Console.WriteLine("Create Suv-tyre");
}
}
public class SuvWindow : IWindow//创建suv汽车的车窗
{
public void Message()
{
Console.WriteLine("Create Suv-Window");
}
}
}
好处在于,如果我们需要创建一款卡车,那么我们直接创建一个卡车的factory(同样集成自IFactory),再创建相应的卡车的零部件类进行制造即可。
缺点在于,如果我们需要创建汽车前围板或者车门等零部件,那么我们就得修改源代码(不满足开闭原则),在接口中添加相应的方法以及其他实现类中的实现。