抽象工厂
抽象工厂是在工厂方法的基础之上,在抽象出来一个工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
在上图所示的类图中,可以看到,ChineseFactory
和AmericanFactory
都继承自接口IAbstractFactory
,而在每个工厂方法下,又有两个方法,IPhoneColor
,IPhoneSize
,接下来就是具体的实现IPhoneColor
和IPhoneSize
两个接口的代码。那么我们就可以这样使用。
IAbstractFactory chineseFactory = new ChineseFactory();
chineseFactory.MadePhoneSize().MadeSize();
chineseFactory.MadePhoneColor().MadeColor();
我们只需要实例化一个具体的工厂即可。在上面的例子中,MadePhoneSize().MadeSize()
,可以确定是就是造中国的手机。
好了,完整代码如下。
using System;
namespace _03_AbstractFactory
{
class Program
{
/// <summary>
/// 抽象工厂
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//制作美国手机
IAbstractFactory americanFactory = new AmericanFactory();
americanFactory.MadePhoneSize().MadeSize();
americanFactory.MadePhoneColor().MadeColor();
//制作中国手机
IAbstractFactory chineseFactory = new ChineseFactory();
chineseFactory.MadePhoneSize().MadeSize();
chineseFactory.MadePhoneColor().MadeColor();
Console.ReadKey();
//如果做巴基斯坦手机呢?
}
}
//工厂接口
public interface IAbstractFactory
{
IPhoneSize MadePhoneSize();
IPhoneColor MadePhoneColor();
}
public class AmericanFactory : IAbstractFactory
{
public IPhoneColor MadePhoneColor()
{
return new AmericanPhoneColor();
}
public IPhoneSize MadePhoneSize()
{
return new AmericanPhoneSize();
}
}
public class ChineseFactory : IAbstractFactory
{
public IPhoneColor MadePhoneColor()
{
return new ChinesePhoneColor();
}
public IPhoneSize MadePhoneSize()
{
return new ChinesePhoneSize();
}
}
public interface IPhoneSize
{
void MadeSize();
}
public interface IPhoneColor
{
void MadeColor();
}
public class AmericanPhoneSize : IPhoneSize
{
public void MadeSize()
{
Console.WriteLine("美国手机大小制作好了");
}
}
public class ChinesePhoneSize : IPhoneSize
{
public void MadeSize()
{
Console.WriteLine("中国手机大小制作好了");
}
}
public class AmericanPhoneColor : IPhoneColor
{
public void MadeColor()
{
Console.WriteLine("美国手机颜色制作好了");
}
}
public class ChinesePhoneColor : IPhoneColor
{
public void MadeColor()
{
Console.WriteLine("中国手机颜色制作好了");
}
}
}