背景
- 工厂模式也可应用到多类产品,单类产品请参考https://www.jianshu.com/p/09992d064155
- 优势:调用时省略了产品的生成细节
- 要点
- 接口实现同类产品间和工厂间的互换
- 具体工厂中绑定多类具体产品,不接受产品传参
- 多类产品间可交互
- 与工厂方法的异同
- 两者均可处理多类产品,但约定抽象工厂处理多类,工厂方法处理单类
- 具体工厂均绑定了具体产品,抽象工厂不通过方法
示例
using static System.Console;
namespace AbstractFactory
{
// 接口保证互换性,下同
public interface IPerson { void Introduce(); }
public class Chinese : IPerson
{
public void Introduce() => WriteLine("I am chinese.");
}
public class American : IPerson
{
public void Introduce() => WriteLine("I am American.");
}
public interface ITableWare { void Choose(); }
public class Chopsticks : ITableWare
{
public void Choose() => WriteLine("A pair of chopsticks is chosen.");
}
public class Fork : ITableWare
{
public void Choose() => WriteLine("A fork is chosen.");
}
public interface IFactory
{
IPerson Person { get; }
ITableWare Tableware { get; }
void Talk(); // 异类产品交互
}
public class ChineseFactory : IFactory
{
// 绑定具体类到属性而非传参,调用时忽略生成细节
public IPerson Person => new Chinese();
public ITableWare Tableware => new Chopsticks();
public void Talk()
{
Person.Introduce();
Tableware.Choose();
WriteLine("Chinese people like to use chopsticks.");
ReadKey();
}
}
public class AmericanFactory : IFactory
{
public IPerson Person => new American();
public ITableWare Tableware => new Fork();
public void Talk()
{
Person.Introduce();
Tableware.Choose();
WriteLine("American people like to use fork.");
ReadKey();
}
}
public class Client
{
public void Execute()
{
// 改为印度工厂时
// - 增加IPerson的子类Indian,不影响旧代码
// - 增加ITableWare的子类Hand,不影响旧代码
// - 增加IFactory的子类IndianFactory,不影响旧代码
// - 修改本类中工厂,必须
var factory = new ChineseFactory();
factory.Talk();
}
}
class Demo
{
static void Main(string[] args)
{
var client = new Client();
client.Execute();
}
}
}
网友评论