具体工厂实现抽象工厂,不同具体工厂创建不同的一系列具体产品。
抽象工厂和工厂方法的区别:
- 抽象工厂使用工厂方法创建
一系列的对象
- 工厂方法通常只创建一个对象
包括:抽象工厂、具体工厂、抽象产品、具体产品
例子:
工厂A创建A系列产品,工厂B创建B系列产品。
抽象工厂:抽象工厂
具体工厂:工厂A、工厂B
抽象产品:笔接口、书籍接口
具体产品:A系列笔和书籍、B系列笔和书籍
UML类图
相关接口和类定义:
using System;
namespace AbstractFactory
{
/// <summary>
/// 抽象工厂
/// </summary>
interface IAbstractFactory
{
IPen CreatePen();
IBook CreateBook();
}
/// <summary>
/// 工厂A,创建A系列产品
/// </summary>
class FactoryA : IAbstractFactory
{
public IPen CreatePen()
{
return new PenA();
}
public IBook CreateBook()
{
return new BookA();
}
}
/// <summary>
/// 工厂B,创建B系列产品
/// </summary>
class FactoryB : IAbstractFactory
{
public IPen CreatePen()
{
return new PenB();
}
public IBook CreateBook()
{
return new BookB();
}
}
/// <summary>
/// 笔接口
/// </summary>
interface IPen
{
void Write();
}
/// <summary>
/// 笔A
/// </summary>
class PenA : IPen
{
public void Write()
{
Console.WriteLine("笔A");
}
}
/// <summary>
/// 笔B
/// </summary>
class PenB : IPen
{
public void Write()
{
Console.WriteLine("笔B");
}
}
/// <summary>
/// 书籍接口
/// </summary>
interface IBook
{
void Read();
}
/// <summary>
/// 书籍A
/// </summary>
class BookA : IBook
{
public void Read()
{
Console.WriteLine("书籍A");
}
}
/// <summary>
/// 书籍B
/// </summary>
class BookB : IBook
{
public void Read()
{
Console.WriteLine("书籍B");
}
}
}
调用示例:
using System;
namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//不同工厂,创建不同系列产品
//工厂A
Console.WriteLine("工厂A创建:");
IAbstractFactory factory = new FactoryA();
Create(factory);
Console.WriteLine();
//工厂B
Console.WriteLine("工厂B创建:");
factory = new FactoryB();
Create(factory);
}
private static void Create(IAbstractFactory factory)
{
IPen pen = factory.CreatePen();
pen.Write();
IBook book = factory.CreateBook();
book.Read();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》