韩国教育网站模板,网站建设费用摊销会计分录,昆明网站建设织梦,企业网站导航一般做多高系列总链接#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客
参考#xff1a;
C设计模式#xff1a;抽象工厂模式#xff08;风格切换案例#xff09;_c 抽象工厂-CSDN博客
1.概念 抽象工厂模式#xff08;Abstract Factory Pattern#xff09;是软件设计… 系列总链接《大话设计模式》学习记录_net 大话设计-CSDN博客
参考
C设计模式抽象工厂模式风格切换案例_c 抽象工厂-CSDN博客
1.概念 抽象工厂模式Abstract Factory Pattern是软件设计模式中的一种创建型模式它提供了一种创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。这种模式强调的是家族的概念即一个工厂可以生产出一整套兼容的产品。
2.结构与实现
结构
抽象工厂 (Abstract Factory)
定义了一个创建一组相关或相互依赖对象的接口但不负责这些对象的具体类。它声明了一组用于创建不同产品的方法但并不实现它们。
具体工厂 (Concrete Factory)
实现了抽象工厂接口负责创建具体的产品对象。每个具体工厂对应一个特定的产品族并能够创建该族中的所有产品。
抽象产品 (Abstract Product)
为每类产品定义了一个接口具体产品的类实现这个接口。不同的产品族可能有不同的抽象产品接口。
具体产品 (Concrete Product)
由具体工厂创建的对象实现了抽象产品接口。每个具体产品属于一个特定的产品族并且与同一族中的其他产品兼容。
客户端代码 (Client Code)
客户端代码使用抽象工厂和抽象产品接口来操作对象而不直接引用具体工厂或具体产品的类。这使得客户端代码可以独立于具体的产品实现。
通过上述结构抽象工厂模式提供了一种方式来创建一系列相关的对象而无需指定它们的具体类。这种方式不仅提高了代码的灵活性和可维护性还使得添加新的产品族变得更为简单因为只需要增加一个新的具体工厂和相应的产品实现即可。
实现
#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H//抽象产品类
class IProductPhone
{
public:IProductPhone() {}virtual void showPhoneType(){}
};//具体产品类
class Piphone : public IProductPhone
{
public:Piphone() {}void showPhoneType(){qDebug() i am iphone;}
};class PXiaomi : public IProductPhone
{
public:PXiaomi() {}void showPhoneType(){qDebug() i am xiaomi;}
};//抽象工厂类
class IFactory
{
public:IFactory() {}virtual IProductPhone* createPhone(){}
};//具体工厂类
class IphoneFactory : public IFactory
{
public:IphoneFactory(){}IProductPhone* createPhone(){qDebug() create a iphone; return new Piphone;}
};class XiaomiFactory : public IFactory
{
public:XiaomiFactory(){}IProductPhone* createPhone(){qDebug() create a xiaomi; return new PXiaomi;}
};#endif // ABSTRACTFACTORY_H使用
#include QCoreApplication
#include QDebug#include abstractFactory.hint main(int argc, char *argv[])
{IFactory* ifactnullptr;IProductPhone* iprod nullptr;QString currentFact xiaomi;if(xiaomi currentFact){ifact new XiaomiFactory;}else if(iphone currentFact){ifact new IphoneFactory;}iprod ifact-createPhone();iprod-showPhoneType();return 0;
}3.应用 数据库访问层DAL
当应用程序需要支持多种数据库后端时可以为每种数据库类型定义一个工厂用于创建相应的数据访问对象DAO。这样可以轻松切换数据库而无需修改业务逻辑代码。如
MySQLFactory 创建适用于 MySQL 数据库的数据访问对象。OracleFactory 创建适用于 Oracle 数据库的数据访问对象。
4.优缺点及适用环境
优点
将客户端代码与具体的产品实现解耦
客户端只需要依赖于抽象接口而不需要知道具体的类。这提高了代码的灵活性和可维护性。
易于添加新的产品族
只需创建一个新的具体工厂和相关的产品实现即可扩展系统支持新的产品族符合“开闭原则”。
确保同一产品族的产品一起使用
确保从同一个工厂创建的产品是兼容的避免了不同产品族之间的不一致问题。
简化了复杂的对象创建逻辑
将对象创建逻辑集中到工厂中使得客户端代码更加简洁减少了重复代码。 缺点
增加了系统的复杂度
引入了额外的接口和类可能会使系统更难理解特别是对于小型项目或简单需求来说。
难以添加新产品
如果需要添加一个新的产品类型而不是新的产品族则必须修改所有工厂类违反了“开闭原则”。
可能导致过度设计
在一些场景下可能没有必要引入这么复杂的模式导致设计过于复杂增加不必要的开发和维护成本。 适用环境
当系统需要独立于其产品的创建、组合和表示时
特别是当你希望提供一个框架或库但不想暴露内部的具体实现细节。
当一个系统要由多个产品系列中的一个来配置时
比如多平台UI库、多数据库后端的支持等每个系列有自己的一组相关联的对象。
当系统需要支持插件或模块化扩展时
插件可以提供自己的工厂实现以创建特定功能和服务而不影响核心系统。
当需要频繁切换不同产品族时
例如在运行时根据用户选择或其他条件动态地改变产品族。 总结来说抽象工厂模式非常适合那些需要处理多个产品系列的应用程序并且这些系列中的对象需要保持一致性。它有助于提高代码的灵活性和可维护性但也可能带来额外的复杂性和设计上的挑战。在决定是否采用此模式时应权衡项目的实际需求和复杂度。