打印

【C++设计模式】抽象工厂类(AbstractFactory)

[复制链接]
1698|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2014-10-22 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
,Factory模式对于对象的创建给予开发人员提供了很好的实现策略,但是Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory

相关帖子

沙发
keer_zu|  楼主 | 2014-10-22 14:41 | 只看该作者
UML图:



使用特权

评论回复
板凳
keer_zu|  楼主 | 2014-10-22 14:58 | 只看该作者
源码:

头文件abs_f.h

#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class AbstractProductA
{
public:
virtual ~AbstractProductA();
AbstractProductA();

};
class AbstractProductB
{
public:
virtual ~AbstractProductB();
  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();
};
class AbstractFactory
{
public:
virtual ~AbstractFactory ();
virtual  AbstractProductA* CreateProductA( )  = 0 ;
virtual  AbstractProductB* CreateProductB( )  = 0 ;
protected:
AbstractFactory( );

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

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

};
#endif

使用特权

评论回复
地板
keer_zu|  楼主 | 2014-10-22 14:59 | 只看该作者
c++文件:

abs_f.cpp

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



AbstractProductA::AbstractProductA()
{    }
AbstractProductA::~AbstractProductA()
{    }
AbstractProductB::AbstractProductB()
{
}
AbstractProductB::~AbstractProductB()
{
}
ProductA1::ProductA1()
{
cout<< "Product A1..."<< endl;
}
ProductA1::~ProductA1()
{
}
ProductA2::ProductA2()
{
cout<< "Product A2..."<< endl;
}
ProductA2::~ProductA2()
{
}
ProductB1::ProductB1()
{
cout<< "Product B1..." <<endl;
}
ProductB1::~ProductB1()
{
}
ProductB2::ProductB2()
{
cout<< "Product B2..." <<endl;
}
ProductB2::~ProductB2()
{
}

AbstractFactory::AbstractFactory()
{

}
AbstractFactory::~AbstractFactory()
{
}
ConcreteFactory1::ConcreteFactory1()
{
}
ConcreteFactory1::~ConcreteFactory1()
{
}
AbstractProductA* ConcreteFactory1::CreateProductA()
{
  return new ProductA1();
}
AbstractProductB* ConcreteFactory1::CreateProductB()
{
  return new ProductB1();
}
ConcreteFactory2::ConcreteFactory2()
{
}
ConcreteFactory2::~ConcreteFactory2()
{
}
AbstractProductA* ConcreteFactory2::CreateProductA()
{
  return new ProductA2();
}
AbstractProductB* ConcreteFactory2::CreateProductB()
{
  return new ProductB2();
}



int main()
{
  ConcreteFactory1* cf1  = new ConcreteFactory1();
  cf1->CreateProductA();
  cf1->CreateProductB();
  ConcreteFactory2* cf2  = new ConcreteFactory2();
  cf2->CreateProductA();
  cf2->CreateProductB();

return 0;
}

使用特权

评论回复
5
keer_zu|  楼主 | 2014-10-22 15:01 | 只看该作者
抽象工厂别前一种工厂模式优点在哪里呢?

使用特权

评论回复
6
xlsbz| | 2014-10-22 16:54 | 只看该作者
keer_zu 发表于 2014-10-22 15:01
抽象工厂别前一种工厂模式优点在哪里呢?

关键是c+有什么用呢

使用特权

评论回复
7
xlsbz| | 2014-10-22 16:55 | 只看该作者
keer_zu 发表于 2014-10-22 15:01
抽象工厂别前一种工厂模式优点在哪里呢?

c++关键有优点么?什么地方用的上?

使用特权

评论回复
8
keer_zu|  楼主 | 2014-10-22 17:42 | 只看该作者
xlsbz 发表于 2014-10-22 16:55
c++关键有优点么?什么地方用的上?

直接支持面向对象,如果用C的话,面向对象的封装性容易做到,但是继承有点困难。
现在的编译器基本都支持C++了,用C和C++一起完成任务比较合适。特别是类似服务器程序那样:上有JAVA,下有C做底层,自身特点决定角色,成分发挥其优势。

使用特权

评论回复
9
keer_zu|  楼主 | 2014-10-22 17:45 | 只看该作者
xlsbz 发表于 2014-10-22 16:54
关键是c+有什么用呢

当然有用了,面向对象是一种很好的设计方法学,c++更直接些。

使用特权

评论回复
10
keer_zu|  楼主 | 2014-10-24 10:46 | 只看该作者
abs_factory.tar.gz (5.95 KB)

源码,用g++编译即可。

使用特权

评论回复
11
HORSE7812| | 2014-10-24 11:06 | 只看该作者
:)

使用特权

评论回复
12
keer_zu|  楼主 | 2014-10-24 11:17 | 只看该作者
HORSE7812 发表于 2014-10-24 11:06

welcome. Why not give some suggesting.

使用特权

评论回复
13
keer_zu|  楼主 | 2014-11-6 18:26 | 只看该作者
keer_zu 发表于 2014-10-24 10:46
源码,用g++编译即可。

居然没人理睬。真没劲啊

使用特权

评论回复
14
keer_zu|  楼主 | 2014-11-21 18:17 | 只看该作者
yyy71cj 发表于 2014-11-6 20:36
版主你必须要将这个指定一个应用的场合,如果在单片机上与C来竞争,C++那是毫无优势的哦 ...

我是一个讨论者,不是讲解者,要是只讲解,那是要收学费的。哈哈
最好的学习不是听讲,而是讨论,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1352

主题

12432

帖子

53

粉丝