简介
工厂方法模式是一种常用的对象创建型设计模式,此模式的核心是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
书中实例
小菜和大鸟聊起他们班同学学雷锋的事迹,而万能的大鸟在附和了几句后,终于把“雷锋”拉进了设计模式,小菜使用简单工厂模式把“雷锋代码”写了出来,雷锋可以扫地,买米......,功能是实现了,可问题是学生当雷锋,肯定有毕业的一天,学生毕业后,代码就得大改,简单工厂模式就不再“简单了”。这时,工厂方法模式出现了......
工厂方法模式实现程序
//雷锋类
class LeiFeng
{
public void Sweep()
{
Console.WriteLine("扫地");
}
public void Wash()
{
Console.WriteLine("洗衣");
}
public void BuyRice()
{
Console.WriteLine("买米");
}
}
//学雷锋的大学生类
class Undergraduate : LeiFeng
{
}
//社区志愿者
class Volunteer : LeiFeng
{
}
//雷锋工厂
interface IFactory
{
LeiFeng CreateLeiFeng();
}
//学雷锋的大学生工厂
class UndergraduateFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Undergraduate();
}
}
//社区志愿者工厂
class VolunteerFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Volunteer();
}
}
//客户端
class Program
{
static void Main(string[] args)
{
//工厂方法模式
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
Console.Read();
}
}
组成类图
关系介绍
抽象工厂(Creator)是工厂方法模式的核心,具体工厂(Concrete Creator)是其子类,继承于抽象工厂。抽象产品(Product)是工厂方法模式中对象的父类,具体产品(Concrete Product)继承于抽象产品。具体工厂依赖于具体产品。
工厂方法模式的构成
Creator(抽象工厂角色): 是工厂方法模式的核心,任何在模式中创建的对象的工厂类必须实现这个接口
Concrete Creator(具体工厂角色):是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象
Product(抽象产品角色):工厂方法模式所创建的对象的父类,也就是产品对象的共同父类或共同拥有的接口。
Concrete Product(具体产品角色):这个角色实现了抽象产品角色所定义的接口。某具体产品与这一产品的工厂一一对应。
工厂方法模式的优点
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
1.完全实现"开放-封闭原则",实现了可扩展性
2.更复杂的层次结构,可以应用于产品结构更复杂的场合
使用场景
1.对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
2.只需要一种产品,而不想知道也不需要知道究竟是为哪个工厂生产的,即最终选用哪个具体工厂的决定权在生产者一方。