抽象工厂模式提供了一种将一组相关或相互依赖的对象集合进行创建的方式,而无需指定它们具体的类。在抽象工厂模式中,一个工厂接口被定义用于创建相关或依赖对象的一组工厂,这些工厂通常实现同一个抽象工厂接口。抽象工厂模式通常用于以下情况:
①、当一个系统需要独立于它所创建的对象的类时。
②、当一组对象需要在一起使用时,可以通过一个工厂接口来确保一起使用的一致性。
③、当一组对象被设计为共享一个公共主题时。
通过使用抽象工厂模式,我们可以将对象的创建与具体类的实现分离开来,并且可以更加容易地替换不同的工厂来创建不同的对象,而不需要修改客户端代码。
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"
}
}