首页 > 其他分享 >设计模式之抽象工厂模式

设计模式之抽象工厂模式

时间:2025-01-09 22:13:24浏览次数:1  
标签:use 模式 工厂 抽象 产品 设计模式 ptr

设计模式之抽象工厂模式(Abstract Factory Pattern)

模式定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

类图

代码

//抽象产品类A
class AbstractProductA {
public:
    virtual void use() = 0;
    //抽象类的析构函数设置为虚函数
	virtual ~AbstractProductA() {}
};

class ProductA1 : public AbstractProductA {
public:
    void use() override
    {
    	cout << "void ProductA1::use()" << endl;
    }
};
class ProductA2 : public AbstractProductA {
public:
    void use() override
    {
    	cout << "void ProductA2::use()" << endl;
    }
};

//抽象产品类B
class AbstractProductB {
public:
    virtual void use() = 0;
    //抽象类的析构函数设置为虚函数
	virtual ~AbstractProductB() {}
};

class ProductB1 : public AbstractProductB {
public:
    void use() override
    {
    	cout << "void ProductB1::use()" << endl;
    }
};
class ProductB2 : public AbstractProductB {
public:
    void use() override
    {
    	cout << "void ProductB2::use()" << endl;
    }
};

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

class ConcreteFactory1 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
    	return new ProductA1();
	}
    AbstractProductB* createProductB() override {
    	return new ProductB1();
	}
};
class ConcreteFactory2 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
    	return new ProductA2();
	}
    AbstractProductB* createProductB() override {
    	return new ProductB2();
	}
};


void test()
{
    //工厂1生产A1和B1
	unique_ptr<AbstractFactory> factory1(new ConcreteFactory1());
	unique_ptr<AbstractProductA> productA1(factory1->createProductA());
    unique_ptr< AbstractProductB> productB1(factory1->createProductB());
	productA1->use();
    productB1->use();
	//工厂2生产A2和B2
	cout << endl << endl;
	unique_ptr<AbstractFactory> factory2(new ConcreteFactory2());
	unique_ptr<AbstractProductA> productA2(factory2->createProductA());
    unique_ptr< AbstractProductB> productB2(factory2->createProductB());
	productA2->use();
    productB2->use();
}

抽象工厂模式的优点

  1. 抽象工厂模式隔离了具体类的生成,使得客户端并不需要知道什么被创建;
  2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一产品族中的对象;
  3. 增加新的产品族很方便(生成新的具体工厂),无需修改已有系统代码,符合开闭原则。

抽象工厂模式的缺点

  1. 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

使用场景

  1. 用户无需关心对象的创建过程,将对象的创建和使用解耦;
  2. 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构;
  3. 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  4. 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  5. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

参考博文

  1. https://design-patterns.readthedocs.io/zh-cn/latest/creational_patterns/abstract_factory.html

标签:use,模式,工厂,抽象,产品,设计模式,ptr
From: https://www.cnblogs.com/Invinc-Z/p/18662970

相关文章

  • 设计模式之观察者模式
    设计模式之观察者模式(ObserverPattern)模式定义观察者模式(ObserverPattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Sourc......
  • Java设计模式之享元模式
    什么是享元模式享元模式(Flyweight)就是把部分和整体的关系用树形结构来表示,从而使客户端能够把一个个的部分对象和有他们组合起来的整体对象采用同样的方式看待,他也是一个继承的替代,其实具体的说,享元模式就是用时间交换了空间。用程序的运行速度来读取是否重复的对象内容,然......
  • 设计模式-装饰模式
    装饰模式(DecoratorPattern)是结构型设计模式之一,它允许动态地给一个对象添加一些额外的职责,而无需改变其结构。装饰模式通过创建一个装饰类,使用继承的方式来扩展对象的功能,从而避免了大量的子类化问题。装饰模式的关键要点:组件接口(Component):定义一个接口,表示被装饰的对象和装......
  • Spark 源码分析(一) SparkRpc中序列化与反序列化Serializer的抽象类解读 (java序列化部
    目录(3)JavaSerializerInstance定义了一个Java序列化实例(1)构造方法参数(2)方法1:serializeStream(3)方法2:deserializeStreamdefaultClassLoader(4)方法3:deserializeStreamloader(5)方法4:serialize(6)方法5:deserializeloader(7)方法6:deserializedefaul......
  • Java进阶__抽象、内部类
    抽象类和抽象方法抽象方法使用abstract关键字修饰的没有方法体的方法称为抽象方法。抽象方法必须在子类中被实现,否则子类也需要声明为抽象类。包含抽象方法的类称为抽象类。抽象类不能被实例化,不能通过new关键字创建对象。抽象类的特点抽象类可以包含属性、方法以及......
  • 设计模式-策略模式
    作者:京东工业孙磊一、概念策略模式(StrategyPattern)也称为(PolicyParttern)。它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变换,不会影响到使用算法的客户。策略模式属性行为模式。策略模式结构图二、实际应用业务场景:业务需要监听多种消息,将接收到的......
  • 设计模式-策略模式
    策略模式(StrategyPattern)是一种行为型设计模式,它允许定义一系列算法(或策略),并将每个算法封装起来,使得它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端。策略模式的关键要点:上下文(Context):持有一个策略对象,并且通过调用策略对象的方法来执行特定的算法或操作。......
  • Spark 源码分析(一) SparkRpc中序列化与反序列化Serializer的抽象类解读 (正在更新中~)
    接上一章请先看解读序列化抽象类第一部分目录接上一章请先看解读序列化抽象类第一部分2.Java序列化实现类JavaSerializer(1)JavaSerializationStream类定义了一个java序列化流继承了SerializationStream抽象类代码实际例子1:序列化(2)JavaDeserializationStream......
  • C++二十三种设计模式之观察者模式
    C++二十三种设计模式之观察者模式一、组成二、目的三、缺点四、示例代码一、组成抽象主题:维护观察者对象列表,具备通知功能。具体主题:实现维护观察者对象列表具体策略和通知功能。抽象观察者:为主题类提供更新接口。具体观察者:实现更新接口。二、目的用于一个对象......
  • 11.1实验3:工厂方法模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解工厂方法模式的动机,掌握该模式的结构; 2、能够利用工厂方法模式解决实际问题。[实验任务一]:加密算法 目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际......