模式简介
工厂模式主要是用于对实例的创建进行统一管理的设计模式,适用于需要频繁创建实例或者实例创建逻辑较为复杂的情景,所有访问者都通过工厂来统一获取实例则可以使得访问者更加专注于具体业务逻辑的开发。
工厂模式通常分为简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)。
简单工厂模式并不是GoF设计模式的一种,而是一种工厂模式常见的实现方式。
工厂方法模式是将创建实例的方法抽象到接口,不同的工厂实现该接口并对创建实例的具体逻辑进行编写,这样可以把创建实例的逻辑交给具体的工厂来编写,而外部调用则统一通过接口方法。
抽象工厂模式是将一组相关的创建实例的方法抽象到接口,通过一个例子或许更好理解,例如有一个专门生产电脑配件的厂商A和一个专门生产手机配件的厂商B,厂商A既生产电脑主板也生产电脑屏幕,而厂商B既生产手机主板也生产手机屏幕,电脑主板和手机主板都属于主板,电脑屏幕和手机屏幕都属于屏幕,那么就可以对这两个工厂进行抽象化处理,将生产主板和屏幕的方法抽象到接口中,两个工厂只要实现了接口并完成具体的生产逻辑的编写,那就既可以生产主板,也可以生产屏幕。
常见的应用场景:数据库连接工厂、日志记录器工厂、图形界面库的部件工厂、加密算法工厂等。
特性 | 简单工厂模式 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|---|
定义 | 一个工厂类负责创建多个产品类的实例 | 多个工厂类,每个负责创建一个产品类的实例 | 多个工厂类,每个负责创建一组相关的产品类的实例 |
灵活性 | 低,新增产品需要修改工厂类,不符合开闭原则 | 高,每个产品对应一个工厂类,易于扩展 | 高,每个产品组对应一个工厂类,易于扩展 |
扩展性 | 低,新增产品需要修改工厂类,违反开闭原则 | 高,每个产品对应一个工厂类,不影响其他产品 | 高,每个产品组对应一个工厂类,不影响其他产品组 |
复杂性 | 低,整个创建过程在一个工厂类中完成 | 适中,每个产品有独立的工厂类 | 高,每个产品组有独立的工厂类 |
依赖性 | 高,客户端依赖工厂类和产品类 | 中,客户端依赖工厂接口和产品接口 | 低,客户端依赖抽象工厂接口和抽象产品接口 |
例子 | 配件工厂,既生产手机主板和屏幕,又生产电脑主板和屏幕 | 手机主板工厂生产手机主板,手机屏幕工厂生产手机屏幕 | 电脑配件工厂生产电脑主板和电脑屏幕,手机配件工厂生产手机主板和手机屏幕 |
模式结构
1. 简单工厂模式
- 工厂(Factory): 负责创建产品的类,包含一个创建产品的方法。
- 产品(Product): 具体的产品类,实现了工厂定义的产品接口或抽象类。
- 客户端(Client): 使用工厂创建产品的代码。
2. 工厂方法模式
- 抽象工厂(Creator): 声明创建产品的抽象方法,可以是接口或抽象类。
- 具体工厂(ConcreteCreator): 实现抽象工厂,负责创建具体的产品。
- 产品(Product): 具体的产品类,实现了抽象工厂定义的产品接口或抽象类。
- 客户端(Client): 使用具体工厂创建产品的代码。
3. 抽象工厂模式
- 抽象工厂(AbstractFactory): 声明创建一系列相关产品的抽象方法,可以是接口或抽象类。
- 具体工厂(ConcreteFactory): 实现抽象工厂,负责创建一系列相关的具体产品。
- 抽象产品(AbstractProduct): 声明一系列相关产品的抽象接口或抽象类。
- 具体产品(ConcreteProduct): 实现抽象产品,具体产品属于一系列中的某个具体类别。
- 客户端(Client): 使用具体工厂创建一系列相关产品的代码。
工作原理
1. 简单工厂模式
- 客户端通过调用工厂的方法来创建产品,而不直接实例化产品类。
- 工厂根据客户端的请求,内部决定创建哪个具体的产品类。
- 客户端只需与工厂接口打交道,无需关心产品的具体创建过程。
2. 工厂方法模式
- 客户端通过与抽象工厂交互,调用抽象工厂中的方法来创建产品。
- 具体工厂继承抽象工厂,实现抽象工厂中声明的创建产品的方法。
- 客户端无需知道具体产品的类名,只需要使用抽象工厂创建产品即可。
- 不同的具体工厂可以创建不同系列的产品,使系统更具扩展性。
3. 抽象工厂模式
- 客户端通过与抽象工厂交互,调用抽象工厂中的方法来创建一系列相关产品。
- 具体工厂继承抽象工厂,实现抽象工厂中声明的创建产品的方法。
- 客户端无需关心具体产品的类名,只需要使用抽象工厂创建产品即可。
- 抽象工厂保证了一系列相关产品的兼容性,客户端可以一次性创建一整套产品。
代码示例(C#)
提示:可在本栏目的资源篇“设计模式代码示例合集”下载所有完整代码资源。
产品接口:Product.cs
namespace FactoryPattern;
// 主板
public interface IMotherBoard
{
void OperationMB();
}
// 屏幕
public interface IScreen
{
void OperationSC();
}
// 手机配件
public interface IPhoneAccessory
{
void OperationPA();
}
// 手机主板
public class PhoneMotherBoard : IPhoneAccessory, IMotherBoard
{
public void OperationMB()
{
Console.WriteLine("OperationMB:This is a PhoneMotherBoard.");
}
public void OperationPA()
{
Console.WriteLine("OperationPA:This is a PhoneMotherBoard.");
}
}
// 手机屏幕
public class PhoneScreen : IPhoneAccessory, IScreen
{
public void OperationPA()
{
Console.WriteLine("OperationPA:This is a PhoneScreen.");
}
public void OperationSC()
{
Console.WriteLine("OperationSC:This is a PhoneScreen.");
}
}
// 电脑配件
public interface IComputerAccessory
{
void OperationCA();
}
// 电脑主板
public class ComputerMotherBoard : IComputerAccessory, IMotherBoard
{
public void OperationCA()
{
Console.WriteLine("OperationCA:This is a ComputerMotherBoard.");
}
public void OperationMB()
{
Console.WriteLine("OperationMB:This is a ComputerMotherBoard.");
}
}
// 电脑屏幕
public class ComputerScreen : IComputerAccessory, IScreen
{
public void OperationCA()
{
Console.WriteLine("OperationCA:This is a ComputerScreen.");
}
public void OperationSC()
{
Console.WriteLine("OperationSC:This is a ComputerScreen.");
}
}
简单工厂模式:SimpleFactoryPattern.cs
namespace FactoryPattern;
// 简单工厂模式
class SimpleFactory
{
// 配件工厂
public class AccessoryFactory
{
// 生产手机主板
public PhoneMotherBoard CreatePMB()
{
return new PhoneMotherBoard();
}
// 生产电脑主板
public ComputerMotherBoard CreateCMB()
{
return new ComputerMotherBoard();
}
// 生产手机屏幕
public PhoneScreen CreatePS()
{
return new PhoneScreen();
}
// 生产电脑屏幕
public ComputerScreen CreateCS()
{
return new ComputerScreen();
}
}
}
工厂方法模式:FactoryMethodPattern.cs
namespace FactoryPattern;
// 工厂方法接口
interface IFactoryMethod
{
IPhoneAccessory Create();
}
// 工厂方法模式
class FactoryMethodPattern
{
// 手机主板工厂
public class PhoneMotherBoardFactory : IFactoryMethod
{
// 生产手机主板
public IPhoneAccessory Create()
{
return new PhoneMotherBoard();
}
}
// 手机屏幕工厂
public class PhoneScreenFactory : IFactoryMethod
{
// 生产手机屏幕
public IPhoneAccessory Create()
{
return new PhoneScreen();
}
}
}
抽象工厂模式:AbstractFactoryPattern.cs
namespace FactoryPattern;
// 抽象工厂接口
interface IFactory
{
IMotherBoard CreateMB(); // 生产主板
IScreen CreateSC(); // 生产屏幕
}
// 抽象工厂模式
class AbstractFactoryPattern
{
// 电脑配件工厂
public class MotherBoardFactory : IFactory
{
// 生产电脑主板
public IMotherBoard CreateMB()
{
return new ComputerMotherBoard();
}
// 生产电脑屏幕
public IScreen CreateSC()
{
return new ComputerScreen();
}
}
// 手机配件工厂
public class ScreenFactory : IFactory
{
// 生产手机主板
public IMotherBoard CreateMB()
{
return new PhoneMotherBoard();
}
// 生产手机屏幕
public IScreen CreateSC()
{
return new PhoneScreen();
}
}
}
测试代码: Program.cs
// ************* 2.简单工厂模式测试 **************
// using FactoryPattern;
// var accessoryFactory = new SimpleFactory.AccessoryFactory();
// PhoneMotherBoard phoneMotherBoard = accessoryFactory.CreatePMB(); // 手机主板
// PhoneScreen phoneScreen = accessoryFactory.CreatePS(); // 手机屏幕
// ComputerMotherBoard computerMotherBoard = accessoryFactory.CreateCMB(); // 电脑主板
// ComputerScreen computerScreen = accessoryFactory.CreateCS(); // 电脑屏幕
// phoneMotherBoard.OperationPA();
// phoneScreen.OperationPA();
// computerMotherBoard.OperationCA();
// computerScreen.OperationCA();
// ************* 3.工厂方法模式测试 **************
// using FactoryPattern;
// IFactoryMethod phoneMotherBoardFactory = new FactoryMethodPattern.PhoneMotherBoardFactory();
// IFactoryMethod phoneScreenFactory = new FactoryMethodPattern.PhoneScreenFactory();
// IPhoneAccessory phoneMotherBoard = phoneMotherBoardFactory.Create(); // 手机主板
// IPhoneAccessory phoneScreen = phoneScreenFactory.Create(); // 手机屏幕
// phoneMotherBoard.OperationPA();
// phoneScreen.OperationPA();
// ************* 4.抽象工厂模式测试 **************
// using FactoryPattern;
// IFactory computerFactory = new AbstractFactoryPattern.MotherBoardFactory();
// IFactory phoneFactory = new AbstractFactoryPattern.ScreenFactory();
// IMotherBoard computerMB = computerFactory.CreateMB(); // 电脑主板
// IScreen computerSC = computerFactory.CreateSC(); // 电脑屏幕
// IMotherBoard phoneMB = phoneFactory.CreateMB(); // 手机主板
// IScreen phoneSC = phoneFactory.CreateSC(); // 手机屏幕
// computerMB.OperationMB();
// computerSC.OperationSC();
// phoneMB.OperationMB();
// phoneSC.OperationSC();
代码解说
示例代码中我们对三种工厂模式的应用进行了简单的举例说明,但是这还远远没有达到实际开发中所要运用的程度,实际开发中可能需要多种设计模式结合使用,例如工厂模式与单例模式的结合,工厂模式结合对象池技术等等,结合具体需求进行具体的设计,高质量的代码应该是每一位程序员在开发生涯所不断追求的目标,学习设计模式则是编写高质量代码的入门必修课。
如果这篇文章对你有帮助,请给作者点个赞吧!