设为首页 加入收藏

TOP

设计模式-工厂方法 简单工厂 抽象工厂 模板方法 (三)
2014-11-23 17:41:27 来源: 作者: 【 】 浏览:56
Tags:设计模式 工厂 方法 简单 抽象 模板
ory::CheesePizzaTpe:
return new BeiJingCheesePizza;
case PizzaFactory::GreekPizzaType:
return new BeiJingGreekPizza;
case PizzaFactory::PipperPizzaType:
return new BeiJingPipperPizza;
default:
return NULL;
};
}
};

class PizzaFactory
{
public:
enum PizzaType{
CheesePizzaTpe,
GreekPizzaType,
PipperPizzaType,
};
PizzaFactory(void);
~PizzaFactory(void);
AbstractPizza* PizzaFactory(PizzaType type)();
};

//具体的工厂,负责生产BeiJing的pizza。
class BeiJingPizzaFactory : public PizzaFactory
{
public:


BeiJingPizzaFactory(void);
~BeiJingPizzaFactory(void);
AbstractPizza* CreatePizzaByType(PizzaType type)(){
switch (type){
case PizzaFactory::CheesePizzaTpe:
return new BeiJingCheesePizza;
case PizzaFactory::GreekPizzaType:
return new BeiJingGreekPizza;
case PizzaFactory::PipperPizzaType:
return new BeiJingPipperPizza;
default:
return NULL;
};
}
};

关于BeiJingCheesePizza, BeiJingGreekPizza, BeiJingPipperPizza这些就不写了,就是继承于抽象的Pizza。

对扩展开放,对修改关闭:
如果再有天津的,河南的,意大利的等等Pizza。通过使用工厂方法模式,以后即使再有其他地区的pizza店,只需要添加另外的一个具体工厂和具体的产品就行了。不要纠结于增加新的PizzaType怎么办?工厂方法模式专注的点是有新地区的产品,而不是有新的PizzaType。因为最基本的工厂方法模式是一个工厂一个产品,一一对应。如果想着眼于type而忽略地区,可以考虑一种PizzaType一个Pizza工厂,那样添加了新的type,就添加新的工厂和产品就可以了,完美符合对扩展开放,对修改关闭。
子类实例化:
工厂方法模式对外部提供的是一个工厂方法,它是一个抽象接口,这样外部依赖的就是抽象而不是具体,减少代码耦合性。将具体的new的操作放到子类工厂来实现。
应用:
说实话,找应用费了好久,毕竟整天Pizza,Pizza的很难给我们以启发,仅仅是知道模式,而没有看到它的巨大潜力和价值。
学习MFC的都知道Document和Application的关系。不同的Application对应不同的Document。app负责创建doc。app就是工厂,doc就是产品,一个工厂一个产品。

[cpp]
//App是工厂,它保存着创建的产品
//App
class Application
{
public:
void OpenDocument(){//模板方法
m_pDoc = CreateDocment();
m_pDoc->Open();
m_pDoc->Read();
}
void CloseDocument(){//模板方法
m_pDoc->Write();
m_pDoc->Close();
}
private:
virtual Document* CreateDocment() = 0;//工厂方法
private:
Document* m_pDoc;//这个
}

//抽象产品类,文档可以打开关闭,读写。
class Document
{
public:
void Open();
void Close();
void Read();
void Write();
}

//App是工厂,它保存着创建的产品
//App
class Application
{
public:
void OpenDocument(){//模板方法
m_pDoc = CreateDocment();
m_pDoc->Open();
m_pDoc->Read();
}
void CloseDocument(){//模板方法
m_pDoc->Write();
m_pDoc->Close();
}
private:
virtual Document* CreateDocment() = 0;//工厂方法
private:
Document* m_pDoc;//这个
}

//抽象产品类,文档可以打开关闭,读写。
class Document
{
public:
void Open();
void Close();
void Read();
void Write();
}

解释:
上面两个类一看到就会有种欣喜的感觉,将模板方法和工厂方法完美的组合了起来。工厂方法关心的是创建对象,由具体的工厂MyApp负责创建实现具体的产品MyDocument.同时,模板方法OpenDocument面向抽象的创建接口编程,负责定义了一套算法,子类继承了Application,就继承了一套算法,子类不用关心算法执行的步骤,子类只需要实现方法,父类负责调用子类的方法。
像经常看到的状态机代码,状态机的跳转流程是由预先定义的流程定义的,但是OnStateEnter和OnStateExit这样的方法的实现是由具体应用定义的。父类负责调用子类OnStateEnter和OnStateExit方法的具体的实现,模板方法的典型应用。

抽象工厂:
抽象工厂关注的是创建一系列的产品,它是使用工厂方法实现的,不过是拥有多个工厂方法。
代码就不写了。
简单工厂能把具体实现包装起来,让客户端真正达到面向接口编程
工厂方法可以在高层进行编码,让服务端的产品线真正达到面向接口编程
抽象工厂能聚合整个产品簇,让整个服务端的多个产品线真正达到面向接口编程
模板方法同样是在高层进行编码,也同样是面

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 4554 叛逆的小明 下一篇UVA 12529 Fix the Pond(bfs)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 教程 - W3Sch (2025-12-26 12:00:51)
·Python基础教程,Pyt (2025-12-26 12:00:48)
·神仙级python入门教 (2025-12-26 12:00:46)
·“我用Java 8”已成 (2025-12-26 11:19:54)
·下载 IntelliJ IDEA (2025-12-26 11:19:52)