C++/C

程序员有二十年 2024-10-12 11:30:46
工厂方法模式简介

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

这种模式的核心思想是将对象的创建过程与其使用过程分离,从而提高系统的灵活性和可扩展性。通过工厂方法模式,可以在不改变客户端代码的情况下,引入新的产品类型。

工厂方法模式的结构

工厂方法模式通常包含以下几个角色:

Product(产品):定义工厂方法所创建的对象的接口。ConcreteProduct(具体产品):实现Product接口的具体类。Creator(创建者):声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的默认实现,返回一个默认的ConcreteProduct对象。ConcreteCreator(具体创建者):重写工厂方法以返回一个ConcreteProduct的实例。C#实现工厂方法模式

下面是一个使用C#实现工厂方法模式的示例。

1. 定义产品接口public interface IProduct{ string GetName();}2. 定义具体产品public ConcreteProductA : IProduct{ public string GetName() {return "Product A"; }}public ConcreteProductB : IProduct{ public string GetName() {return "Product B"; }}3. 定义创建者public abstract Creator{ // 工厂方法 public abstract IProduct FactoryMethod(); // 业务逻辑 public void SomeOperation() { IProduct product = FactoryMethod(); Console.WriteLine("Created: " + product.GetName()); }}4. 定义具体创建者public ConcreteCreatorA : Creator{ public override IProduct FactoryMethod() {return new ConcreteProductA(); }}public ConcreteCreatorB : Creator{ public override IProduct FactoryMethod() {return new ConcreteProductB(); }}5. 客户端代码public Program{ public static void Main(string[] args) { Creator creatorA = new ConcreteCreatorA(); creatorA.SomeOperation(); // 输出: Created: Product A Creator creatorB = new ConcreteCreatorB(); creatorB.SomeOperation(); // 输出: Created: Product B }}运行结果

运行上述代码后,控制台将输出:

Created: Product ACreated: Product B

如下所示:

image-20241011082814956C++实现工厂方法模式#include <iostream>#include <memory>// 产品抽象类class Product {public:virtual ~Product() = default;virtual void use() const = 0;};// 具体产品类Aclass ConcreteProductA : public Product {public:void use() const override {std::cout << "Using ConcreteProductA" << std::endl; }};// 具体产品类Bclass ConcreteProductB : public Product {public:void use() const override {std::cout << "Using ConcreteProductB" << std::endl; }};// 工厂抽象类class Factory {public:virtual ~Factory() = default;virtual std::unique_ptr<Product> createProduct() const = 0;};// 具体工厂类Aclass ConcreteFactoryA : public Factory {public:std::unique_ptr<Product> createProduct() const override {return std::make_unique<ConcreteProductA>(); }};// 具体工厂类Bclass ConcreteFactoryB : public Factory {public:std::unique_ptr<Product> createProduct() const override {return std::make_unique<ConcreteProductB>(); }};int main() {// 使用具体工厂A创建产品Astd::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();std::unique_ptr<Product> productA = factoryA->createProduct(); productA->use();// 使用具体工厂B创建产品Bstd::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();std::unique_ptr<Product> productB = factoryB->createProduct(); productB->use();return 0;}

结果如下所示:

image-20241011093322480总结

工厂方法模式通过将对象的创建过程封装在具体的创建者类中,使得系统更加灵活,易于扩展。当需要添加新的产品类型时,只需创建新的具体产品和具体创建者,而不需要修改现有的代码。这符合开闭原则(Open/Closed Principle),即对扩展开放,对修改关闭。

0 阅读:0

程序员有二十年

简介:感谢大家的关注