概述
工厂方法模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂方法是简单工厂进一步的抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不在负责所有产品的创建,而是将具体创建工作交给子类来完成。这个核心类仅仅负责人给吃具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂模式可以允许在不修改工厂角色的情况下引进新产品。
角色与结构
抽象工厂:是工厂方法模式的核心,与应用程序无关。任何模式中创建的对象的工厂类必须实现这个接口。
具体工厂:实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或者共同拥有的接口。
具体产品:这个角色实现抽象产品所定义的接口。某具体产品有专门的具体工厂创建。它们之间往往一一对应。
实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _8FactoryMethod
{
class Program
{
static void Main(string[] args)
{
//初始化 生产工厂
Creator bf = new BasketballFactory();
Creator ff = new FootballFactory();
Creator ppf = new PingpangballFactory();
//生产
Ball BF= bf.CreateBall();
BF.ShowBall();
Ball FF = ff.CreateBall();
FF.ShowBall();
Ball PPF = ppf.CreateBall();
PPF.ShowBall();
Console.ReadLine();
}
}
/// <summary>
/// 抽象父类 球类
/// </summary>
public abstract class Ball
{
public abstract void ShowBall();
}
/// <summary>
/// 篮球类 实现抽象父类中的ShowBall方法
/// </summary>
public class Baseketball : Ball
{
public override void ShowBall()
{
Console.WriteLine("我是篮球");
}
}
/// <summary>
/// 足球类 实现抽象父类中的ShowBall方法
/// </summary>
public class Football : Ball
{
public override void ShowBall()
{
Console.WriteLine("我是足球");
}
}
/// <summary>
/// 乒乓球类 实现抽象父类中的ShowBall方法
/// </summary>
public class Pingpangbll : Ball
{
public override void ShowBall()
{
Console.WriteLine("我是乒乓球");
}
}
/// <summary>
/// 抽象工厂类 定义生产方法
/// </summary>
public abstract class Creator
{
public abstract Ball CreateBall();
}
/// <summary>
/// 篮球工厂
/// </summary>
public class BasketballFactory : Creator
{
public override Ball CreateBall()
{
return new Baseketball();//生产篮球
}
}
/// <summary>
/// 足球工厂类
/// </summary>
public class FootballFactory : Creator
{
public override Ball CreateBall()
{
return new Football();//生产足球
}
}
/// <summary>
/// 乒乓球工厂类
/// </summary>
public class PingpangballFactory : Creator
{
public override Ball CreateBall()
{
return new Pingpangbll();//生产乒乓球
}
}
}
/*output:
我是篮球
我是足球
我是乒乓球
*/