C++/C#/Java 设计模式之抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单独工厂。抽象工厂模式通过提供一个超级工厂创建其他工厂的接口,使得客户端使用抽象的接口操作具体对象,从而实现客户端与具体工厂类解耦。

使用C++实现抽象工厂模式(Abstract Factory)

下面是一个使用C++实现抽象工厂模式的例子:

c++ 复制代码
#include <iostream>
#include <string>

// 抽象产品A
class AbstractProductA {
public:
    virtual ~AbstractProductA() {}
    virtual std::string use() = 0;
};

// 抽象产品B
class AbstractProductB {
public:
    virtual ~AbstractProductB() {}
    virtual std::string eat() = 0;
};

// 具体产品A1
class ProductA1 : public AbstractProductA {
public:
    std::string use() override {
        return "Using Product A1";
    }
};

// 具体产品A2
class ProductA2 : public AbstractProductA {
public:
    std::string use() override {
        return "Using Product A2";
    }
};

// 具体产品B1
class ProductB1 : public AbstractProductB {
public:
    std::string eat() override {
        return "Eating Product B1";
    }
};

// 具体产品B2
class ProductB2 : public AbstractProductB {
public:
    std::string eat() override {
        return "Eating Product B2";
    }
};

// 抽象工厂
class AbstractFactory {
public:
    virtual ~AbstractFactory() {}
    virtual AbstractProductA* createProductA() = 0;
    virtual AbstractProductB* createProductB() = 0;
};

// 具体工厂1
class Factory1 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
        return new ProductA1();
    }
    AbstractProductB* createProductB() override {
        return new ProductB1();
    }
};

// 具体工厂2
class Factory2 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
        return new ProductA2();
    }
    AbstractProductB* createProductB() override {
        return new ProductB2();
    }
};

// 客户端代码
void clientCode(AbstractFactory* factory) {
    AbstractProductA* productA = factory->createProductA();
    AbstractProductB* productB = factory->createProductB();

    std::cout << productA->use() << std::endl;
    std::cout << productB->eat() << std::endl;

    delete productA;
    delete productB;
}

int main() {
    AbstractFactory* factory1 = new Factory1();
    AbstractFactory* factory2 = new Factory2();

    std::cout << "Using the products created by Factory 1:" << std::endl;
    clientCode(factory1);

    std::cout << "Using the products created by Factory 2:" << std::endl;
    clientCode(factory2);

    delete factory1;
    delete factory2;

    return 0;
}

运行结果如下所示:

在这个例子中,我们定义了两个抽象产品类AbstractProductAAbstractProductB,以及两个具体产品类ProductA1ProductA2ProductB1ProductB2。我们还定义了一个抽象工厂类AbstractFactory,以及两个具体工厂类Factory1Factory2

客户端代码使用抽象工厂接口来创建具体产品,并使用这些产品。通过使用抽象工厂模式,我们可以在不改变客户端代码的情况下,改变具体工厂类和具体产品类。

使用C#实现抽象工厂模式(Abstract Factory)

csharp 复制代码
namespace Abstract_Factory_Pattern
{
    internal class Program
    {
        public interface ILaptop
        {
            void ShowSpecs();
        }

        public interface IDesktop
        {
            void ShowSpecs();
        }

        // Apple 品牌的产品
        public class AppleLaptop : ILaptop
        {
            public void ShowSpecs()
            {
                Console.WriteLine("Apple Laptop Specifications");
            }
        }

        public class AppleDesktop : IDesktop
        {
            public void ShowSpecs()
            {
                Console.WriteLine("Apple Desktop Specifications");
            }
        }

        // Lenovo 品牌的产品
        public class LenovoLaptop : ILaptop
        {
            public void ShowSpecs()
            {
                Console.WriteLine("Lenovo Laptop Specifications");
            }
        }

        public class LenovoDesktop : IDesktop
        {
            public void ShowSpecs()
            {
                Console.WriteLine("Lenovo Desktop Specifications");
            }
        }

        public interface IComputerFactory
        {
            ILaptop CreateLaptop();
            IDesktop CreateDesktop();
        }

        public class AppleFactory : IComputerFactory
        {
            public ILaptop CreateLaptop()
            {
                return new AppleLaptop();
            }

            public IDesktop CreateDesktop()
            {
                return new AppleDesktop();
            }
        }

        public class LenovoFactory : IComputerFactory
        {
            public ILaptop CreateLaptop()
            {
                return new LenovoLaptop();
            }

            public IDesktop CreateDesktop()
            {
                return new LenovoDesktop();
            }
        }

        static void Main(string[] args)
        {

            // 创建工厂
            IComputerFactory appleFactory = new AppleFactory();
            IComputerFactory lenovoFactory = new LenovoFactory();

            // 创建 Apple 产品的笔记本和台式机
            ILaptop appleLaptop = appleFactory.CreateLaptop();
            IDesktop appleDesktop = appleFactory.CreateDesktop();
            appleLaptop.ShowSpecs();
            appleDesktop.ShowSpecs();

            // 创建 Lenovo 产品的笔记本和台式机
            ILaptop lenovoLaptop = lenovoFactory.CreateLaptop();
            IDesktop lenovoDesktop = lenovoFactory.CreateDesktop();
            lenovoLaptop.ShowSpecs();
            lenovoDesktop.ShowSpecs();
        }
    }
}

运行结果如下所示:

使用Java实现抽象工厂模式

java 复制代码
package src.Design_Patterns;

public class Abstract_Factory_Pattern 
{
    public interface Laptop 
    {
        void showSpecs();
    }
    
    public interface Desktop 
    {
        void showSpecs();
    }

    // Apple 品牌的产品
    public class AppleLaptop implements Laptop {
        @Override
        public void showSpecs() {
            System.out.println("Apple Laptop Specifications");
        }
    }

    public class AppleDesktop implements Desktop {
        @Override
        public void showSpecs() {
            System.out.println("Apple Desktop Specifications");
        }
    }

    // Lenovo 品牌的产品
    public class LenovoLaptop implements Laptop {
        @Override
        public void showSpecs() {
            System.out.println("Lenovo Laptop Specifications");
        }
    }

    public class LenovoDesktop implements Desktop {
        @Override
        public void showSpecs() {
            System.out.println("Lenovo Desktop Specifications");
        }
    }

    public interface ComputerFactory {
        Laptop createLaptop();
        Desktop createDesktop();
    }

    public class AppleFactory implements ComputerFactory {
        @Override
        public Laptop createLaptop() {
            return new AppleLaptop();
        }
    
        @Override
        public Desktop createDesktop() {
            return new AppleDesktop();
        }
    }
    
    public class LenovoFactory implements ComputerFactory {
        @Override
        public Laptop createLaptop() {
            return new LenovoLaptop();
        }
    
        @Override
        public Desktop createDesktop() {
            return new LenovoDesktop();
        }
    }

    public  void test()
    {
        // 创建工厂
        ComputerFactory appleFactory = new AppleFactory();
        ComputerFactory lenovoFactory = new LenovoFactory();

        // 创建 Apple 产品的笔记本和台式机
        Laptop appleLaptop = appleFactory.createLaptop();
        Desktop appleDesktop = appleFactory.createDesktop();
        appleLaptop.showSpecs();
        appleDesktop.showSpecs();

        // 创建 Lenovo 产品的笔记本和台式机
        Laptop lenovoLaptop = lenovoFactory.createLaptop();
        Desktop lenovoDesktop = lenovoFactory.createDesktop();
        lenovoLaptop.showSpecs();
        lenovoDesktop.showSpecs();
    }

    public static void main(String[] args) {
        Abstract_Factory_Pattern afp = new Abstract_Factory_Pattern();
        afp.test();
    }

}

运行结果如下所示:

相关推荐
源码姑娘几秒前
基于DeepSeek的智慧医药系统(源码+部署教程)
java·人工智能·程序人生·毕业设计·springboot·健康医疗·课程设计
morris1315 分钟前
【redis】布隆过滤器的Java实现
java·redis·布隆过滤器
五行星辰19 分钟前
Java链接redis
java·开发语言·redis
编程毕设19 分钟前
【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
java·微信小程序·小程序
邪恶的贝利亚20 分钟前
C++之序列容器(vector,list,dueqe)
开发语言·c++
原来是猿20 分钟前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list
异常驯兽师22 分钟前
Java集合框架深度解析:List、Set与Map的核心区别与应用指南
java·开发语言·list
成功助力英语中国话25 分钟前
SDK编程,MFC编程,WTL编程之间的关系
c++·mfc
计算机学姐27 分钟前
基于Asp.net的教学管理系统
vue.js·windows·后端·sqlserver·c#·asp.net·visual studio
且听风吟ayan44 分钟前
leetcode day26 重复的子字符串
算法·leetcode·c#