【设计模式】AbstractFactory

main.cpp

#include "AbstractFactory.h"
#include "Product.h"
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {

    AbstractFactory *cf1 = new ConcreateFactory1();
    cf1->CreateProductA();
    cf1->CreateProductB();

    AbstractFactory *cf2 = new ConcreateFactory2();
    cf2->CreateProductA();
    cf2->CreateProductB();

    return 0;
}

Product.h

#ifndef _PRODUCT_H
#define _PRODUCT_H

class AbstractProductA {
public :
    virtual ~AbstractProductA();
protected :
    AbstractProductA();
};

class AbstractProductB {
public:
    virtual ~AbstractProductB();
protected:
    AbstractProductB();
};

class ProductA1 :public AbstractProductA {
public :
    ProductA1();
    ~ProductA1();
};

class ProductA2 :public AbstractProductA {
public:
    ProductA2();
    ~ProductA2();
};

class ProductB1 :public AbstractProductB {
public:
    ProductB1();
    ~ProductB1();
};

class ProductB2 :public AbstractProductB {
public:
    ProductB2();
    ~ProductB2();
};

#endif

Product.cpp

#include "Product.h"
#include <iostream>
using namespace std;

AbstractProductA::AbstractProductA() {}

AbstractProductA::~AbstractProductA() {}

AbstractProductB::AbstractProductB() {}

AbstractProductB::~AbstractProductB() {}

ProductA1::ProductA1() {
    cout << "ProductA1..." << endl;
}

ProductA1::~ProductA1() {}

ProductA2::ProductA2() {
    cout << "ProductA2..." << endl;
}

ProductA2::~ProductA2() {}

ProductB1::ProductB1() {
    cout << "ProductB1..." << endl;
}

ProductB1::~ProductB1() {}

ProductB2::ProductB2() {
    cout << "ProductB2..." << endl;
}

ProductB2::~ProductB2() {}

AbstractFactory.h

#ifndef _ABSTRACT_FACTORY_H
#define _ABSTRACT_FACTORY_H

class AbstractProductA;
class AbstractProductB;

class AbstractFactory {
public :
    virtual ~AbstractFactory();
    virtual AbstractProductA *CreateProductA() = 0;
    virtual AbstractProductB *CreateProductB() = 0;
protected :
    AbstractFactory();
};

class ConcreateFactory1 : public AbstractFactory {
public :
    ConcreateFactory1();
    ~ConcreateFactory1();
    AbstractProductA *CreateProductA();
    AbstractProductB *CreateProductB();
};

class ConcreateFactory2 : public AbstractFactory {
public:
    ConcreateFactory2();
    ~ConcreateFactory2();
    AbstractProductA *CreateProductA();
    AbstractProductB *CreateProductB();
};

#endif

AbstractFactory.cpp

#include "AbstractFactory.h"
#include "Product.h"
#include <iostream>
using namespace std;

AbstractFactory::AbstractFactory() {}

AbstractFactory::~AbstractFactory() {}

ConcreateFactory1::ConcreateFactory1() {}

ConcreateFactory1::~ConcreateFactory1() {}

AbstractProductA *ConcreateFactory1::CreateProductA() {
    return new ProductA1();
}

AbstractProductB *ConcreateFactory1::CreateProductB() {
    return new ProductB1();
}

ConcreateFactory2::ConcreateFactory2() {}

ConcreateFactory2::~ConcreateFactory2() {}

AbstractProductA *ConcreateFactory2::CreateProductA() {
    return new ProductA1();
}

AbstractProductB *ConcreateFactory2::CreateProductB() {
    return new ProductB1();
}
时间: 2024-11-05 19:41:22

【设计模式】AbstractFactory的相关文章

C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂]的问题,我们引出了[工厂方法]模式,通过子类化工厂类,解决了工厂类责任的划分,

C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

原文:C#设计模式之三抽象工厂模式(AbstractFactory)[创建型] 一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂

浅析设计模式(六)——创建型模式之Abstract-Factory(抽象工厂模式)

抽象工厂模式Abstract-Factory 本文的套路: 抽象工厂模式的定义 抽象工厂模式的参与者及其角色 抽象工厂模式的类图 抽象工厂模式的示例 参考 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 前面[浅析设计模式(四)--创建型模式之Simple-Factory(简单工厂方法,非设计模式)]中介绍的简单工厂方法,虽然已经对变化的部分进行了封装,但是这里只由一个对象负责所有的具体类的实例化,因此每次有新增对象类型时,都需要改变工厂的源码进行扩展.

设计模式(三)抽象工厂模式(AbstractFactory)-创建型

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象.根据LSP原则,任何接受父类型的地方,都应当能够接受子类型.因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例.换言之,也就是这些抽象产品的具体子类的实例.工厂类负责创建抽象产品的具体子类的实例. 抽象工厂模式与工厂方法模式的区别

java设计模式--工厂模式

总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的等级结构. 一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java

C#.Net 设计模式学习笔记之创建型 (一)

1.抽象工厂(Abstract Factory)模式 常规的对象创建方法: //创建一个Road对象 Road road =new Road(); new 的问题: 实现依赖,不能应对"具体实例化类型"的变化. 解决思路: 封装变化点-----哪里变化,封装哪里 潜台词: 如果没有变化,当然不需要额外的封装! 工厂模式的缘起 变化点在"对象创建",因此就封装"对象创建" 面向接口编程----依赖接口,而非依赖实现 最简单的解决方法: class 

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

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

设计模式-工厂模式

一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品:             这三种模式从上到下逐步抽象,并且更具一般性.             GOF在<