讨论之一 abstract factory

dtor 2008-01-07 11:12:42
以下是本人对abstract factory的见解,希望和大家一起讨论。
abstract factory 模式是运用c++的特性:继承性和多态性来完成的一个设计。

这样设计,简单地运用了多态,使client程序更易编写,也使程序的思路清晰,便于维护。
...全文
381 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
matrixdwy 2008-07-02
  • 打赏
  • 举报
回复
LZ的理解属于泛泛而谈,有很多设计模式都是
“运用c++的特性:继承性和多态性来完成的一个设计。这样设计,简单地运用了多态,使client程序更易编写,也使程序的思路清晰,便于维护。”
loki2k 2008-06-25
  • 打赏
  • 举报
回复
如果不这么搞
请问该怎么搞?
wanglovec 2008-06-05
  • 打赏
  • 举报
回复
因为在创建client时是需要调者传入具体的工厂
》》 呵呵 那你 生成具体工厂不需要代码吗? 如果需求变了 这里不业得改变吗?
icosagon 2008-05-13
  • 打赏
  • 举报
回复
工厂类一般是内部实现复杂,外接接口简单
icosagon 2008-05-13
  • 打赏
  • 举报
回复
抽象工厂是为了便于维护,一个工厂类就够了,写多了反而不利于维护
wuliang_227 2008-05-09
  • 打赏
  • 举报
回复
小弟我初学abstract factory时间不长,以下是我的浅见,请勿见笑。 我认为你这样将代码写出来,并没有将abstract factory的妙处写出来,你代码里面着重点在abstract factory如何实现,好处是在别人用他的时候的方便。

比如:我现在写的client代码是不需要知道具体的工厂是哪个,而是只管从工厂里面得到具体的产品就可以了:

class client
{
public:
client(CAbstractFactory* asFac) : mbASFactory(asFac)
{}

void showProduct()
{
/* 我们不需要关注,product 是 CProductA1,CProductA2,CProductB1还是CProductB2
* 因为在创建client时是需要调者传入具体的工厂,所以作为client不需要关心我们是对具体的哪个
* product 在操作,我们将所有的工厂看作是:CAbstractFactory, 不关心其具体的 concrete factory,
* 无论有多少种 concrete factory
* 我想这就是abstract factory的妙处吧。
*/
CAbstractProductA* product = mbASFactory->CreateProductA->WhoAmI();
}

private:
CAbstractFactory* mbASFactory;
};
iambic 2008-05-07
  • 打赏
  • 举报
回复
>以下是本人对********的见解,希望和大家一起讨论。
>********模式是运用c++的特性:继承性和多态性来完成的一个设计。
>这样设计,简单地运用了多态,使client程序更易编写,也使程序的思路清晰,便于维护。

你把你的理解说出来,但是把模式的名字盖住。看谁还猜得出来你说的模式是哪个。
  • 打赏
  • 举报
回复
CConcreteFactory1* pFactory1 = new CConcreteFactory1();
~~~~~~~~~~~~~这里为什么要用派生类指针?
CConcreteFactory2* pFactory2 = new CConcreteFactory2();
~~~~~~~~~~~~~~还有这里也是,为什么不用抽象类指针?
sungoco2 2008-05-07
  • 打赏
  • 举报
回复
class CConcreteFactory1 :
public CAbstractFactory
{
public:
CConcreteFactory1(void){};
~CConcreteFactory1(void){};
virtual CAbstractProductA* CreateProductA(){ return new CProductA1(); };
virtual CAbstractProductB* CreateProductB(){ return new CProductB1(); };
};

class CConcreteFactory2 :
public CAbstractFactory
{
public:
CConcreteFactory2(void){};
~CConcreteFactory2(void){};
virtual CAbstractProductA* CreateProductA(){ return new CProductA2(); };
virtual CAbstractProductB* CreateProductB(){ return new CProductB2(); };
};
没什么实际意义.还是把书上那个迷宫的例子拿出来讨论吧.
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
有问题请先GOOGLE,BAIDU
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
接分是王道!
gunsand 2008-01-23
  • 打赏
  • 举报
回复
这个好象是抽象工厂的标准示例代码。我感觉如果PRODUCT 种类不多或者自己用的话。
完全可以写的简单点。。
WG_Wolf 2008-01-22
  • 打赏
  • 举报
回复
我也觉得跟 抽象工厂 离得比较远。
好像抽象工场是是解决由不同的搭配产生不同的产品,如果每一种都要写各类的话,
代码量不仅增大,而且不便于维护,用抽象工厂解决“组合爆炸”问题吧。
我觉的《设计模式》挺经典的,四人帮写的。
taodm 2008-01-18
  • 打赏
  • 举报
回复
很少很少有只单独使用一种厂的场合。一般都是几种厂方法联用来组成一个真正的厂的。
割裂开它们进行单独讨论没有太大意义。
michney 2008-01-18
  • 打赏
  • 举报
回复
> > 无需指定它们具体的类

唔,你的代码中
new CConcreteFactory1
new CConcreteFactory2
不是都明确指定了Factory?至于后来的 CreateProductA,最多说是隔离了具体类型的构造过程与调用代码的耦合,是Factory Method的优势,与Abstract Factory没什么关系吧?这个灵活性究竟在哪里?
=====================================================================================
这个问题可以用RTTI+配置文件来解决
cut9 2008-01-18
  • 打赏
  • 举报
回复
其实,是什么形式不重要。如果说 Design pattern里的定义是一种“标准”理解。那么,还有其他的理解和表现方式。
只要抓住一点,Abstract Factory 会导致:对 协议(或标准,或功能) 的实现,可以有很多版本,这多个版本的实现
有一个共同的接口,使用这个接口,可以取到每个版本的具体实现。

wanglovec 2008-01-13
  • 打赏
  • 举报
回复
Abstract Factory没什么关系吧?这个灵活性究竟在哪里?

> > 可以很容易增加产品系列,但对增加单个产品无能为力(工厂方法可以解决)

》》更正 可以很容易增加族,但 对增加产品等级无能为力
wanglovec 2008-01-13
  • 打赏
  • 举报
回复
Abstract Factor适用以下情况

1 客户 不依赖产品类实例如何实现
2 使用多个产品族中一族
3 产品之间有逻辑关联
wanglovec 2008-01-13
  • 打赏
  • 举报
回复
Abstract Factory没什么关系吧?这个灵活性究竟在哪里?

>>可以很容易增加产品系列,但对增加单个产品无能为力(工厂方法可以解决)
BlueGenie 2008-01-12
  • 打赏
  • 举报
回复
>>abstract factory 模式是运用c++的特性:继承性和多态性来完成的一个设计
抽象、封装、继承、多态是面向对象的基本特征。抽象封装了变化、封装隐藏了细节、
继承扩展了功能、多态定制了行为。
个人觉得abstract factory的要点还在于通过单个对象的替换实现了整个产品系列的替换。
加载更多回复(12)

5,529

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧