工厂模式
前言
工厂模式是对创建对象条件的封装又可以叫做多态性工厂模式,根据不同的条件创建不同的实例。是为了解决简单工厂模式中,产品类过多时导致简单工厂类种判断过多的问题,符合开闭原则。
一、工厂模式(Factory Method)
不同条件下创建不同实例,封装创建的细节,不同条件下创建不同的实例。
二、角色
- 抽象工厂(IFactory):工厂方法的核心,与程序无关,创建的对象的工厂类必须实现这个接口。
- 具体工厂(ConcreteFactory):实现抽象工厂的具体工厂类,类数量与具体产品对应,保证一个工厂可以创建一种类型的产品。
- 抽象产品(IProduct):工厂创建对象的超类型,产品对象共同拥有的接口
- 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,某具体产品由专门的具体工厂创建。
提示:具体工厂和具体产品往往是一对一对应的
。
三、应用场景
- 创建对象需要大量重复代码的情况,可以使用工厂模式
- 客户端不依赖产品类实例,而是依赖于产品类的抽象。
- 一个类通过其子类来指定创建那个类。
四、代码实现
1.抽象工厂
代码如下(示例):抽象具体工厂公共方法
/// <summary>
/// 抽象工厂
/// </summary>
public interface IFactory
{
IProduct ClassNewObject();
}
2.具体工厂
代码如下(示例):实例化具体产品的细节工厂,提供实例化后的具体对象
/// <summary>
/// 具体工厂A
/// 指定A工厂只生产产品A的实例
/// </summary>
public class Factory_A : IFactory
{
private IProduct product;
public IProduct ClassNewObject()
{
Console.WriteLine("创建Product_A的实例");
product = new Product_A();
return product;
}
}
/// <summary>
/// 具体工厂B
/// 指定B工厂只生产产品B的实例
/// </summary>
public class Factory_B : IFactory
{
private IProduct product;
public IProduct ClassNewObject()
{
Console.WriteLine("创建Product_B的实例");
product = new Product_B();
return product;
}
}
3.抽象产品
代码如下(示例):抽象产品,定义产品的公共接口
/// <summary>
/// 抽象产品
/// </summary>
public interface IProduct
{
void PrintCurrClassFullName();
}
4.具体产品
代码如下(示例):负责管理产品的具体实现
/// <summary>
/// 具体产品
/// 负责管理产品A的具体实现
/// </summary>
public class Product_A : IProduct
{
public void PrintCurrClassFullName()
{
Console.WriteLine("当前类的FullName为:" + this.GetType().FullName);
}
}
/// <summary>
/// 具体产品
/// 负责管理产品B的具体实现
/// </summary>
public class Product_B : IProduct
{
public void PrintCurrClassFullName()
{
Console.WriteLine("当前类的FullName为:" + this.GetType().FullName);
}
}
5.调用客户端
代码如下(示例):
/// <summary>
/// 调用客户端
/// 指定调用方法
/// </summary>
public class FactoryMethodClient
{
public void mainMethod()
{
IFactory factory = new Factory_A();
factory.ClassNewObject().PrintCurrClassFullName();
factory = new Factory_B();
factory.ClassNewObject().PrintCurrClassFullName();
Console.WriteLine("调用结束");
}
}
6.项目输出
创建Product_A的实例
当前类的FullName为:FactoryMethod.Demo.Product_A
创建Product_B的实例
当前类的FullName为:FactoryMethod.Demo.Product_B
调用结束
总结
优点
- 灵活性增强
- 典型的解耦框架,只需要知道产品的抽象类,无需关心实例化过程,满足迪米特法则,依赖倒置原则和里氏替换原则。
缺点
- 类的数量增多,项目复杂度提高
- 系统更加抽象,理解难度提高
- 抽象产品只能生产一种产品,此
弊端可引入抽象工厂模式解决
。