概述
抽象工厂模式的意图是为创建一组相关或相互依赖对象提供了一个接口,而且不需指定它们的具体类。
抽象工厂可以向客户提供一个接口,使客户可以在不必指定产品具体类型的情况下,创建多个产品家族中的对象,它强调“系列对象”的变化。抽象工厂在开发中使用的频率很高。
角色与结构
抽象工厂:声明一个创建具体产品对象的操作接口(实际上是创建一个具体工厂的借口)
具体工厂:实现创建具体产品对象的操作
抽象产品:声明一类产品对象接口
具体产品:定义一个被相应具体工厂创建的产品对象;实现抽象产品接口。
客户端:调用抽象工厂和抽象产品类声明的接口。
在抽象工厂模式中,产品的创建由具体工厂来完成,抽象工厂模式的具体工厂不止负责一种具体产品的创建,而是负责一个具体产品族的创建。
实例
抽象工厂类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
/// <summary>
/// 抽象工厂类:提供创建不同品牌手机屏幕和主板
/// 抽象工厂模式:围绕一个超级工厂创建其他工厂。提供创建多个产品的的接口。
/// </summary>
public abstract class Factory
{
public abstract Screen CreateScreen();
public abstract MotherBoard CreateMotherBoard();
}
}
手机屏幕类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public abstract class Screen
{
public abstract void Produce();
}
}
手机主板类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public abstract class MotherBoard
{
public abstract void Produce();
}
}
苹果手机主板类和屏幕类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public class AppleMotherBoard : MotherBoard
{
public override void Produce()
{
Console.WriteLine("苹果手机主板");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public class AppleScreen : Screen
{
public override void Produce()
{
Console.WriteLine("苹果手机屏幕");
}
}
}
小米手机主板类和屏幕类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public class XiaoMiMotherBoard : MotherBoard
{
public override void Produce()
{
Console.WriteLine("小米手机主板");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public class XiaoMIScreen : Screen
{
public override void Produce()
{
Console.WriteLine("小米手机屏幕");
}
}
}
手机工厂类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public class AppleFactory : Factory
{
public override MotherBoard CreateMotherBoard()
{
return new AppleMotherBoard();
}
public override Screen CreateScreen()
{
return new AppleScreen();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
public class XiaoMiFactory : Factory
{
public override MotherBoard CreateMotherBoard()
{
return new XiaoMiMotherBoard();
}
public override Screen CreateScreen()
{
return new XiaoMIScreen();
}
}
}
客户端测试
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//小米工厂生产小米手机的屏幕和主板
Factory xiamiFactory = new XiaoMiFactory();
Screen xiaomiScreen = xiamiFactory.CreateScreen();
xiaomiScreen.Produce();
MotherBoard xiaomiMotherBoard = xiamiFactory.CreateMotherBoard();
xiaomiMotherBoard.Produce();
Console.WriteLine();
//苹果工厂生产苹果手机的屏幕和主板
Factory appleFactory = new AppleFactory();
Screen appleScreen = appleFactory.CreateScreen();
appleScreen.Produce();
MotherBoard appleMotherBoard = appleFactory.CreateMotherBoard();
appleMotherBoard.Produce();
}
}
}
/*output:
小米手机屏幕
小米手机主板
苹果手机屏幕
苹果手机主板
*/