概述:
工厂方法(factory method):工厂方法通过一个抽象类实现了所有对产品的加工操作代码,唯独将产品的构建方法写成抽象方法。继承这个抽象类的具体类只重写其构建方法,这样就实现了对于不同被构建产品复用相同的加工操作逻辑。工厂方法适用于需要在子类中才能决定实例化哪个被操作对象,同时这些被操作对象又复用相同操作逻辑的场合。
类图:
代码示例:
1.工厂里的产品抽象类
/// <summary>
/// 工厂里的产品抽象类
/// </summary>
public abstract class Product{}
2.具体的产品
/// <summary>
/// 具体的产品
/// </summary>
public class ConcreteProduct : Product{}
3.创建含有工厂方法的抽象业务类
/// <summary>
/// 含有工厂方法的抽象业务类
/// </summary>
public abstract class Creator
{
void FactoryMethod();
}
4.具体的工厂方法实现类
/// <summary>
/// 具体的工厂方法实现类
/// </summary>
public class ConcreteCreator : Creator
{
void FactoryMethod();
}
其他示例:
步骤很简单,为了防止自己忘记,从博客园里摘抄噬菌体大哥的一个例子,稍微改进一下便于理解
///
/// 产品接口
///
public abstract class IProduct
{
public abstract void Behavior();
}
///
/// A类型产品
///
class ProductA : IProduct
{
public override void Behavior()
{
Console.WriteLine("产品A的行为");
}
}
///
/// B类型产品
///
class ProductB : IProduct
{
public override void Behavior()
{
Console.WriteLine("产品B的行为");
}
}
///
/// 含有工厂方法的抽象业务类
///
public abstract class ACreator
{
public abstract IProduct FactoryMethod();
public void OpreateMethod()
{
IProduct product = FactoryMethod();
//对product的一系列操作
}
}
///
/// 生产A类型产品的具体业务类
///
public class CreatorA : ACreator
{
public override IProduct FactoryMethod()
{
return new ProductA();
}
}
///
/// 生产B类型产品的具体业务类
///
public class CreatorB : ACreator
{
public override IProduct FactoryMethod()
{
return new ProductB();
}
}
客户端调用:
ACreator create = new CreatorA();
IProduct product = create.FactoryMethod();
product.Behavior();
补充TerryLee的例子
原始错误已经更正过来
namespace DesignPatternLab.FactoryMethodPackage
{
class FactoryMethodSample4
{
}
/// <summary>
/// 定义抽象接口
/// </summary>
public abstract class Log
{
public abstract void Write();
}
/// <summary>
/// 具体实现类
/// </summary>
public class EventLog : Log
{
public override void Write()
{
Console.WriteLine("EventLog Write Success"); ;
}
}
/// <summary>
/// 具体实现类
/// </summary>
public class FileLog : Log
{
public override void Write()
{
Console.WriteLine("FileLog Write Success");
}
}
/// <summary>
/// 定义抽象方法接口
/// </summary>
public abstract class LogFactory
{
public abstract Log Create();
}
/// <summary>
/// 具体实现的实例化类
/// </summary>
public class EventFactory:LogFactory
{
public override Log Create()
{
return new EventLog();
}
}
/// <summary>
/// 具体实现实例化的类
/// </summary>
public class FileFactory : LogFactory
{
public override Log Create()
{
return new FileLog();
}
}
}
//客户端调用如下
LogFactory factory = new EventFactory();
Log log = factory.Create();
log.Write();
小结:
工厂模式应用的非常多,希望记住,能熟练应用,最起码面试的时候能写出来