设计模式(002)创建型之抽象工厂模式

文章介绍了抽象工厂模式的概念,它用于创建相关或依赖对象的集合,无需指定它们的具体类。通过示例展示了如何在C++和Java中实现该模式,包括创建不同类型的操作系统(如Windows和MacOS)和对应的软件(如MicrosoftWord和Pages),强调了模式在更换工厂以创建不同对象时的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        抽象工厂模式提供了一种将一组相关或相互依赖的对象集合进行创建的方式,而无需指定它们具体的类。在抽象工厂模式中,一个工厂接口被定义用于创建相关或依赖对象的一组工厂,这些工厂通常实现同一个抽象工厂接口。抽象工厂模式通常用于以下情况:

①、当一个系统需要独立于它所创建的对象的类时。
②、当一组对象需要在一起使用时,可以通过一个工厂接口来确保一起使用的一致性。
③、当一组对象被设计为共享一个公共主题时。

通过使用抽象工厂模式,我们可以将对象的创建与具体类的实现分离开来,并且可以更加容易地替换不同的工厂来创建不同的对象,而不需要修改客户端代码。

1、场景设计

实现场景:创建一些不同类型的操作系统和软件,且一款软件只能安装在特定的操作系统上

2、C++实现

#include <iostream>

using namespace std;

class OperatingSystem {
    public:
        virtual string getName()=0;
};

class Software{
    public:
        virtual string getName()=0;
};


class Windows:public OperatingSystem {
    string getName(){
        string str = "Windows";
        return str;
    }
};

class MacOS:public OperatingSystem {
    string getName(){
        string str = "MacOS";
        return str;
    }
};

class Word:public Software {
    string getName(){
        string str = "Microsoft Word";
        return str;
    }
};

class Pages:public Software {
    string getName(){
        string str = "Pages";
        return str;
    }
};


//抽象工厂接口
class AbstractFactory {
    public:
        virtual OperatingSystem* createOperatingSystem()=0;
        virtual Software* createSoftware()=0;
};

//Windows工厂
class WindowsFactory:public AbstractFactory {
    OperatingSystem* createOperatingSystem() {
        return new Windows();
    }
    Software* createSoftware() {
        return new Word();
    }
};

//MacOS工厂
class MacOSFactory:public AbstractFactory {
    OperatingSystem* createOperatingSystem() {
        return new MacOS();
    }
    Software* createSoftware() {
        return new Pages();
    }
};

int main()
{
    AbstractFactory *factory = new WindowsFactory();
    OperatingSystem *os = factory->createOperatingSystem();
    Software *software = factory->createSoftware();

    cout << os->getName() << endl;          // 输出 "Windows"
    cout << software->getName() << endl;    // 输出 "Microsoft Word"


    factory = new MacOSFactory();
    os = factory->createOperatingSystem();
    software = factory->createSoftware();

    cout << os->getName() << endl;          // 输出 "MacOS"
    cout << software->getName() << endl;    // 输出 "Pages"

    return 0;
}

3、Java实现

package creatingpattern.abstractfactory;

public class AbstractFactoryDemo {
    
    public interface OperatingSystem {
        String getName();
    }
    
    public interface Software {
        String getName();
    }

    public static class Windows implements OperatingSystem {
        public String getName() {
            return "Windows";
        }
    }

    public static class MacOS implements OperatingSystem {
        public String getName() {
            return "MacOS";
        }
    }

    public static class Word implements Software {
        public String getName() {
            return "Microsoft Word";
        }
    }

    public static class Pages implements Software {
        public String getName() {
            return "Pages";
        }
    }

    //抽象工厂接口
    public interface AbstractFactory {
        OperatingSystem createOperatingSystem();
        Software createSoftware();
    }
    //Windows工厂
    public static class WindowsFactory implements AbstractFactory {
        public OperatingSystem createOperatingSystem() {
            return new Windows();
        }
        public Software createSoftware() {
            return new Word();
        }
    }
    //MacOS工厂
    public static class MacOSFactory implements AbstractFactory {
        public OperatingSystem createOperatingSystem() {
            return new MacOS();
        }
        public Software createSoftware() {
            return new Pages();
        }
    }

    public static void main(String args[]) {
        AbstractFactory factory = new WindowsFactory();
        OperatingSystem os = factory.createOperatingSystem();
        Software software = factory.createSoftware();

        System.out.println(os.getName());         // 输出 "Windows"
        System.out.println(software.getName());   // 输出 "Microsoft Word"

        factory = new MacOSFactory();
        os = factory.createOperatingSystem();
        software = factory.createSoftware();

        System.out.println(os.getName());        // 输出 "MacOS"
        System.out.println(software.getName());  // 输出 "Pages"
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值