如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法模式将对象的实例化延迟到子类中进行。
工厂方法模式的实现步骤如下,我们以取经团队需要一只猴子的加入为例:
1、先定义一个抽象产品接口(Product),该接口定义产品对象的共同方法(即我们定义一个抽象产品猴子的接口,接口中包含一个输出猴子的方法)。
/// <summary>
/// 抽象产品角色猴子
/// </summary>
public interface Monkey
{
/// <summary>
/// 输出猴子
/// </summary>
void ExportMonkey();
}
2、创建具体产品类(ConcreteProduct),实现抽象产品接口(我们定义具体产品各类猴子类,实现抽象产品猴子的接口中输出猴子的方法)。
1.1 灵明石猴
/// <summary>
/// 具体产品灵明石猴
/// </summary>
public class LingmingStoneMonkey : Monkey
{
/// <summary>
/// 实现抽象产品输出猴子的方法
/// </summary>
public void ExportMonkey()
{
Console.WriteLine("你好!我是灵明石猴");
}
}
1.2 六耳猕猴
/// <summary>
/// 具体产品六耳猕猴
/// </summary>
public class SixEaredMacaque : Monkey
{
/// <summary>
/// 实现抽象产品输出猴子的方法
/// </summary>
public void ExportMonkey()
{
Console.WriteLine("你好!我是六耳猕猴");
}
}
1.3 通背猿猴
/// <summary>
/// 具体产品通背猿猴
/// </summary>
public class TongbeiMonkey : Monkey
{
/// <summary>
/// 实现抽象产品输出猴子的方法
/// </summary>
public void ExportMonkey()
{
Console.WriteLine("你好!我是通背猿猴");
}
}
3、创建抽象工厂类(Factory),定义创建产品对象的方法(即我们定义一个猴子工厂类,内含生产猴子的方法)。
/// <summary>
/// 抽象工厂猴子工厂
/// </summary>
public interface MonkeyFactory
{
/// <summary>
/// 抽象工厂方法创建猴子
/// </summary>
/// <returns></returns>
Monkey CreateMonkey();
}
4、创建具体工厂类(ConcreteFactory),继承抽象工厂类,并实现创建产品对象的方法(即不同的猴子是不同的工厂生产的,所有我们创建对应的工厂)。
4.1 灵明石猴
/// <summary>
/// 具体工厂生产灵明石猴
/// </summary>
public class LingmingStoneMonkeyFactory : MonkeyFactory
{
/// <summary>
/// 生产灵明石猴
/// </summary>
/// <returns></returns>
public Monkey CreateMonkey()
{
Monkey monkey = new LingmingStoneMonkey();
return monkey;
}
}
4.2 六耳猕猴
/// <summary>
/// 具体工厂生产六耳猕猴
/// </summary>
public class SixEaredMacaqueFactory : MonkeyFactory
{
/// <summary>
/// 生产六耳猕猴
/// </summary>
/// <returns></returns>
public Monkey CreateMonkey()
{
Monkey monkey =new SixEaredMacaque();
return monkey;
}
}
4.3 通背猿猴
/// <summary>
/// 具体工厂生产通背猿猴
/// </summary>
public class TongbeiMonkeyFactory : MonkeyFactory
{
/// <summary>
/// 生产通背猿猴
/// </summary>
/// <returns></returns>
public Monkey CreateMonkey()
{
Monkey monkey = new TongbeiMonkey();
return monkey;
}
}
5、客户端通过具体工厂类来创建具体产品对象(现在取经团队需要一只猴子的加入,而且猴子得是六耳猕猴)。
static void Main(string[] args)
{
//现在取经团队需要一只猴子的加入
MonkeyFactory monkeyFactory;//抽象工厂猴子厂
Monkey monkey;//抽象产品猴子
//取经团队想要一只六耳猕猴
monkeyFactory = new SixEaredMacaqueFactory();
//让花果山的六耳猕猴工厂生产一只
monkey = monkeyFactory.CreateMonkey();
//将六耳猕猴给取经团队
monkey.ExportMonkey();
Console.ReadLine();
}
运行结果为(最后给我们取经团队的会是什么呢?):
现在取经团队不想要六耳猕猴,想要灵明石猴了怎么办呢?
//现在取经团队需要一只猴子的加入
MonkeyFactory monkeyFactory;//抽象工厂猴子厂
Monkey monkey;//抽象产品猴子
//取经团队想要一只六耳猕猴
monkeyFactory = new LingmingStoneMonkeyFactory();
//让花果山的六耳猕猴工厂生产一只
monkey = monkeyFactory.CreateMonkey();
//将六耳猕猴给取经团队
monkey.ExportMonkey();
Console.ReadLine();
输出结果
6、做最后的总结:
通过工厂方法模式,客户端只需要知道抽象工厂类和抽象产品接口,无需关心具体的产品对象是如何创建的。工厂方法模式符合开闭原则,可以通过增加具体工厂类和具体产品类来扩展系统的功能。
优点:
1、工厂方法模式符合开闭原则,增加新的产品时,只需要增加相应的具体工厂类,而不需要修改已有的代码。
2、工厂方法模式将产品的创建工作延迟到具体工厂类中,使得核心工厂类与具体产品类解耦,增强了系统的可扩展性。
3、工厂方法模式将责任分配到多个工厂类中,每个工厂类只负责创建特定的产品,使得代码更加清晰、可读性更强。
4、工厂方法模式可以通过继承方式扩展,支持多态性,在系统中可以灵活地引入新的产品。
缺点:
1、工厂方法模式增加了系统的类的数量,增加了代码的复杂度。
2、工厂方法模式需要定义多个具体工厂类,增加了系统的抽象性和理解难度。
3、工厂方法模式的客户端需要知道每个具体工厂类的存在,增加了系统的耦合度。
4、工厂方法模式在需要创建的产品较多时,会导致工厂类的数量增加,代码量增加。
注意:在实际使用中,一般不会在客户端代码中使用new关键字来创建工厂对象,因为如果是使用new关键字来创建工厂对象,对于客户端而言,就不符合开闭原则了,那如何创建呢?就是将具体工厂类的类目存储在配置文件中,再通过程序集的反射机制,读取配置文件中存储的类名字符串生成对象,我这里是为了方便大家理解和熟悉工厂方法模式,所以才使用new关键字。
详细代码已上传: