什么是创建模式
创建型模式是指处理对象创建的设计模式,它们的共同目标是通过某种方式控制对象的创建,以达到更灵活、更可扩展的设计。 创建型模式通常涉及到将对象的创建与使用分离,通过专门的工厂类、构造函数、克隆、抽象工厂、建造者等方式来创建对象。这种方式可以隐藏对象的创建细节,使得对象的创建和使用松耦合,提高了系统的灵活性和可维护性。 常见的创建型模式包括:
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 原型模式
- 建造者模式 这些模式都有不同的特点和使用场景,可以根据具体情况选择合适的模式来实现对象的创建。下面我们将在后续的文章中讲解这五种创建模式。
Tip:我们在讲解设计模式时,将会使用Java和C#两种语言实现。
什么是工厂方法模式
工厂方法模式是一种常见的创建型模式,它定义了一个用于创建对象的接口,但具体的对象创建是由子类决定的。也就是说,工厂方法模式将对象的创建过程封装在一个工厂类中,让子类决定实例化哪一个具体的类。 工厂方法模式包含以下角色:
- 抽象产品(Product):定义了产品的接口,是工厂方法创建的所有对象的父类,描述了所有产品的公共接口。
- 具体产品(Concrete Product):实现抽象产品接口的具体类,是工厂方法创建的目标对象。
- 抽象工厂(Factory):定义了工厂方法的接口,用于创建抽象产品,它是工厂方法模式的核心,任
- 在模式中创建对象的工厂类都必须实现该接口。
- 具体工厂(Concrete Factory):实现抽象工厂接口的具体类,用于创建具体产品对象。 使用工厂方法模式可以使得代码更具有可扩展性和可维护性,可以通过添加新的具体工厂和具体产品来扩展系统,而不需要修改原有的代码。同时,它也符合“开闭原则”,即对扩展开放,对修改关闭的原则,可以提高系统的可维护性和可扩展性。
如何实现工厂方法模式
要实现工厂方法模式,可以按照以下步骤进行:
- 定义抽象产品接口:抽象产品接口定义产品的公共接口方法。
- 定义具体产品类:具体产品类实现抽象产品接口,具体实现产品的功能。
- 定义抽象工厂接口:抽象工厂接口定义工厂方法,用于创建产品对象。
- 定义具体工厂类:具体工厂类实现抽象工厂接口,具体实现工厂方法,用于创建具体的产品对象。
- 在客户端中使用:客户端通过具体工厂类来创建具体产品对象,不需要关心产品对象的创建过程。
Java实现:
代码语言:javascript复制// 抽象产品接口
interface Product {
void use();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("使用具体产品A");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("使用具体产品B");
}
}
// 抽象工厂接口
interface Factory {
Product createProduct();
}
// 具体工厂类A
class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂类B
class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建具体工厂对象
Factory factoryA = new ConcreteFactoryA();
Factory factoryB = new ConcreteFactoryB();
// 使用具体工厂对象创建具体产品对象
Product productA = factoryA.createProduct();
Product productB = factoryB.createProduct();
// 使用产品
productA.use();
productB.use();
}
}
C#实现
代码语言:javascript复制// 抽象产品接口
interface Product {
void Use();
}
// 具体产品类A
class ConcreteProductA : Product {
public void Use() {
Console.WriteLine("使用具体产品A");
}
}
// 具体产品类B
class ConcreteProductB : Product {
public void Use() {
Console.WriteLine("使用具体产品B");
}
}
// 抽象工厂接口
interface Factory {
Product CreateProduct();
}
// 具体工厂类A
class ConcreteFactoryA : Factory {
public Product CreateProduct() {
return new ConcreteProductA();
}
}
// 具体工厂类B
class ConcreteFactoryB : Factory {
public Product CreateProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
class Client {
static void Main(string[] args) {
// 创建具体工厂对象
Factory factoryA = new ConcreteFactoryA();
Factory factoryB = new ConcreteFactoryB();
// 使用具体工厂对象创建具体产品对象
Product productA = factoryA.CreateProduct();
Product productB = factoryB.CreateProduct();
// 使用产品
productA.Use();
productB.Use();
}
}
在上面的示例中,通过定义抽象产品接口和具体产品类,以及定义抽象工厂接口和具体工厂类,实现了工厂方法模式。客户端可以通过具体工厂对象创建具体产品对象,并且不需要知道产品对象的具体创建过程,提高了系统的可扩展性和可维护性。
总结
工厂方法模式是一种创建型设计模式,其核心思想是将对象的创建委托给工厂对象,由工厂对象来创建具体的产品对象,客户端无需关心具体产品对象的创建过程,只需要与工厂接口进行交互即可。工厂方法模式由抽象产品、具体产品、抽象工厂、具体工厂和客户端代码五部分组成。抽象产品定义产品的接口规范,具体产品实现抽象产品的接口规范,抽象工厂定义工厂的接口规范,具体工厂实现抽象工厂的接口规范并负责具体产品的创建,客户端代码使用具体工厂来创建具体产品对象。使用工厂方法模式可以将具体产品对象的创建和客户端代码的耦合度降到最低,从而提高系统的可维护性、可扩展性和可重用性。同时,工厂方法模式也符合开闭原则,因为当需要添加新的产品时,只需要增加新的具体产品类和对应的具体工厂类即可,不需要修改原有的代码。 总之,工厂方法模式是一种简单而又实用的设计模式,适用于需要大量创建复杂对象的场景,是面向对象编程中必不可少的工具之一。