- 浏览: 508707 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jkxydp:
算法运行的结果根本就不对。
BM算法. -
soarwindzhang:
感谢博主的分享,我今天看了您的UFSET非递归的路径压缩时感觉 ...
并查集 -
zhangning290:
楼主好像只考虑了坏字符规则,。没有考虑好后缀
BM算法. -
lsm0622:
文字描述有错误 误导新学者
求有向图的强连通分量(scc):Tarjan算法 -
knightchen:
博主,你太强了!这篇文章对我学习C++多线程很有帮助!谢谢
并发学习之一_windows下ZThread在CodeBlocks上的安装与配置
特征:封装对象的创建.
1,给一个对象添加新类型时,类的创建必然要发生改变,导致了问题的出现.
2,解决办法:强制用一个通用的工厂(factory)来创建对象,而不允许将创建对象的代码遍布于整个程序.
3,如果创建对象的代码都装到这个工厂执行,那么在增加新对象时,所要做的全部工作就是只需修改工厂.
4,每个面向对象的应用程序都需要创建对象,并且因为人们可能添加新类来扩展应用程序,因此工厂模式可能是所有设计模式中最有用的模式之一.
5,工程模式的实现方法之一:在基类中定义一个静态成员函数.
实例代码:
6,多态工厂模式:工厂方法作为单独的类中的虚函数出现.
实例代码:
7,抽象工厂模式:
使用若干工厂方法模式,每个工厂方法模式创建一个不同类型的对象.
1,给一个对象添加新类型时,类的创建必然要发生改变,导致了问题的出现.
2,解决办法:强制用一个通用的工厂(factory)来创建对象,而不允许将创建对象的代码遍布于整个程序.
3,如果创建对象的代码都装到这个工厂执行,那么在增加新对象时,所要做的全部工作就是只需修改工厂.
4,每个面向对象的应用程序都需要创建对象,并且因为人们可能添加新类来扩展应用程序,因此工厂模式可能是所有设计模式中最有用的模式之一.
5,工程模式的实现方法之一:在基类中定义一个静态成员函数.
实例代码:
#include <iostream> #include <stdexcept> #include <vector> using namespace std; class Shape { public: virtual void draw()=0; virtual void erase()=0; virtual ~Shape(){} class shape_error : public logic_error { public: shape_error(string type):logic_error("Cann't create shape: "+type){}; }; static Shape* factory(const string& type) throw(shape_error); }; class Circle : public Shape { Circle(){}//构造函数设为私有,保证只有静态工厂方法可以创建对象 friend Shape* Shape::factory(const string& type); public: void draw(){ cout<<"Circle:Draw"<<endl; } void erase(){ cout<<"Circle:Erase"<<endl; } ~Circle(){ cout<<"Circle:~Circle"<<endl; } }; class Square : public Shape { Square(){}//构造函数设为私有,保证只有静态工厂方法可以创建对象 friend Shape* Shape::factory(const string& type); public: void draw(){ cout<<"Square:Draw"<<endl; } void erase(){ cout<<"Square:Erase"<<endl; } ~Square(){ cout<<"Square:~Circle"<<endl; } }; Shape* Shape::factory(const string& type) throw(shape_error) { if(type=="Circle") return new Circle; if(type=="Square") return new Square; throw shape_error(type); } char* sl[] = { "Circle", "Square", "Square", "Circle", "Circle", "Circle", "Square" }; int main() { vector<Shape*> shapes; try { for(size_t i = 0; i < sizeof sl / sizeof sl[0]; i++) shapes.push_back(Shape::factory(sl[i])); } catch(Shape::shape_error& e) { cout << e.what() << endl; for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++) delete *ite; return EXIT_FAILURE; } for(size_t i = 0; i < shapes.size(); i++) { shapes[i]->draw(); shapes[i]->erase(); } for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++) delete *ite; return 0; }
6,多态工厂模式:工厂方法作为单独的类中的虚函数出现.
实例代码:
#include <iostream> #include <stdexcept> #include <vector> #include <map> using namespace std; class Shape { public: virtual void draw()=0; virtual void erase()=0; virtual ~Shape(){} }; class ShapeFactory //类工厂 { virtual Shape* create()=0; //虚函数 static map<string,ShapeFactory*> factories; public: virtual ~ShapeFactory(){} friend class ShapeFactoryInitializer; //核心方法 class shape_error : public logic_error { public: shape_error(string type):logic_error("Cann't create shape: "+type){}; }; static Shape* createShape(const string& id) throw(shape_error) { if(factories.find(id)!=factories.end()) return factories[id]->create(); else throw shape_error(id); } }; map<string,ShapeFactory*> ShapeFactory::factories; class Circle : public Shape { Circle(){}//构造函数设为私有,保证只有静态工厂方法可以创建对象 friend class ShapeFactoryInitializer; //友元 //注意私有友元类的使用 class Factory; friend class Factory; class Factory : public ShapeFactory { public: Shape* create(){ return new Circle; } friend class ShapeFactoryInitializer; //友元 }; public: void draw(){ cout<<"Circle:Draw"<<endl; } void erase(){ cout<<"Circle:Erase"<<endl; } ~Circle(){ cout<<"Circle:~Circle"<<endl; } }; class Square : public Shape { Square(){}//构造函数设为私有,保证只有静态工厂方法可以创建对象 friend class ShapeFactoryInitializer; //友元 //注意私有友元类的使用 class Factory; friend class Factory; class Factory : public ShapeFactory { public: Shape* create(){ return new Square; } friend class ShapeFactoryInitializer; //友元 }; public: void draw(){ cout<<"Square:Draw"<<endl; } void erase(){ cout<<"Square:Erase"<<endl; } ~Square(){ cout<<"Square:~Circle"<<endl; } }; class ShapeFactoryInitializer { static ShapeFactoryInitializer si; ShapeFactoryInitializer() { ShapeFactory::factories["Circle"]=new Circle::Factory; //这里 ShapeFactory::factories["Square"]=new Square::Factory; //这里 } ~ShapeFactoryInitializer() { for(map<string,ShapeFactory*>::iterator ite=ShapeFactory::factories.begin();ite!=ShapeFactory::factories.end();ite++) delete ite->second; } }; ShapeFactoryInitializer ShapeFactoryInitializer::si; char* sl[] = { "Circle", "Square", "Square", "Circle", "Circle", "Circle", "Square" }; int main() { vector<Shape*> shapes; try { for(size_t i = 0; i < sizeof sl / sizeof sl[0]; i++) shapes.push_back(ShapeFactory::createShape(sl[i])); } catch(ShapeFactory::shape_error& e) { cout << e.what() << endl; for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++) delete *ite; return EXIT_FAILURE; } for(size_t i = 0; i < shapes.size(); i++) { shapes[i]->draw(); shapes[i]->erase(); } for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++) delete *ite; return 0; }
7,抽象工厂模式:
使用若干工厂方法模式,每个工厂方法模式创建一个不同类型的对象.
#include <iostream> using namespace std; class Obstacle { public: virtual void action()=0; }; class Fire : public Obstacle { void action(){ cout<<"Fire."<<endl; } }; class Water : public Obstacle { void action(){ cout<<"Water."<<endl; } }; class Player { public: virtual void interactWith(Obstacle*)=0; }; class MM : public Player { public: void interactWith(Obstacle* ob) { cout<<"MM:"; ob->action(); } }; class GG : public Player { public: void interactWith(Obstacle* ob) { cout<<"GG:"; ob->action(); } }; class GameFactory { public: virtual Player* makePlayer()=0; virtual Obstacle* makeObstacle()=0; }; class GGandWater : public GameFactory { virtual Player* makePlayer(){ return new GG; } virtual Obstacle* makeObstacle(){ return new Water; } }; class MMandFire : public GameFactory { virtual Player* makePlayer(){ return new MM; } virtual Obstacle* makeObstacle(){ return new Fire; } }; class CreateGame //综合管理 { GameFactory* gef; Player* p; Obstacle* ob; public: CreateGame(GameFactory* factory) : gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle()){} void player(){ p->interactWith(ob); } ~CreateGame() { delete gef; delete p; delete ob; } }; int main() { CreateGame g1(new GGandWater); g1.player(); CreateGame g2(new MMandFire); g2.player(); return 0; }
发表评论
-
关于priority_queue
2010-06-18 15:11 36201,关于STL中的priority_queue:确定用top( ... -
深入理解模板4
2010-03-15 12:28 8991,函数模板的半有序: 生成模板函数的时候,编译器将从这些模板 ... -
通用容器4_deque
2010-03-12 17:20 7631,deque特点: (1)将元素放在多个连续的存储块. (2 ... -
通用容器3_vector
2010-03-12 16:52 7861,vector特点: (1)将内容放在一段连续的存储区域,索 ... -
深入理解模板3
2010-03-12 09:57 7781,类模板和函数模板的 ... -
通用容器2
2010-03-11 11:15 6321,所有基本序列容器(vect ... -
深入理解模板2
2010-03-11 10:41 7271,typename关键字: (1)若一个模板代码内部的某个类 ... -
通用容器1
2010-03-10 12:19 7951,一个容器描述了一个持有其他对象的对象. 2,c++处理容器 ... -
深入理解模板1
2010-03-10 11:38 8801,模版参数可以有三种类型:(1)类型;(2)编译时常量;(3 ... -
设计模式之观察者模式
2010-03-04 11:54 8781,解决的问题: 当某些其他对象改变状态时,如果一组对象需要进 ... -
STL算法合集
2010-03-04 10:14 23681,简要描述迭代器的各种形式: (1)InputIterato ... -
通用算法之可调整的函数对象
2010-03-02 16:51 8741,实例代码: #include <algorith ... -
通用算法笔记4
2010-03-02 10:15 6031,generate_n(序列起点,个数,函数发生器) 2,t ... -
设计模式之构建器模式
2010-03-01 11:08 7191,目标:将对象的创建和它的表示法分开. 2,实例代码: ... -
设计模式之虚构造函数模式
2010-02-27 19:39 10901,虚构造函数模式:"现在还不知道需要什么类型的对象 ... -
设计模式之职责链模式
2010-02-20 22:31 10741,职责链的本质:尝试多个解决方法,直到找到一个起作用的方法. ... -
设计模式之策略模式
2010-02-20 21:52 7301,策略(strategy)模式特征:运行时选择算法,可以用多 ... -
设计模式之模板方法模式
2010-02-20 21:41 7671,模板方法模式的重要特征:它的定义在基类中,并且不能改动. ... -
设计模式之代理模式和状态模式
2010-02-20 19:37 11351,代理(Proxy)模式基本思 ... -
设计模式之命令模式
2010-02-19 19:36 7071,命令(command)模式最大的特点:允许向一个函数或者对 ...
相关推荐
java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...
根据提供的标题“深入浅出设计模式之工厂模式”与描述“将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载”,我们可以推测出这部分内容主要关注的是设计模式中的工厂模式。...
在这个"菜鸟教程设计模式之工厂模式代码整理"中,我们将深入探讨工厂模式的基本概念、结构以及如何在实际编程中应用。 工厂模式的核心思想是通过一个专门的工厂类来创建对象,而不是让客户端代码直接实例化具体的...
### JAVA设计模式之工厂模式 #### 一、工厂模式概述 工厂模式是一种常见的设计模式,主要应用于当系统中存在大量的类实例化需求时。通过工厂模式,我们可以避免直接使用`new`关键字创建对象,而是通过工厂类来创建...
在这个“菜鸟教程设计模式之工厂模式代码整理(反射机制改进版)”中,我们主要探讨的是如何利用Java的反射机制来进一步增强工厂模式的功能。 首先,理解工厂模式的基本概念。工厂模式属于创建型设计模式,它提供了...
工厂方法(Factory Method)是工厂模式的一种具体实现,它是《Head First 设计模式》这本书中讲解的重点之一。在这个模式中,一个工厂类声明了一个创建对象的抽象方法,但并不实现这个方法。而是由子类决定要实例化...
JAVA设计模式之工厂模式是软件开发中一种常用的设计模式,它专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。 一、工厂模式的介绍 工厂模式有三种...
### Java设计模式之工厂模式详解 #### 一、引言 设计模式是在软件设计过程中针对常见问题而提出的标准化解决方案。其中,“工厂模式”是面向对象编程中最常用的模式之一,主要目的是封装实例化过程,使代码更加...
【Java设计模式之工厂模式Factory】是面向对象编程领域中常用的设计模式,它提供了一种创建对象的最佳方式。工厂模式的主要思想是将对象的创建过程封装起来,使得客户端(使用对象的代码)无需关心对象的具体创建...
在软件开发中,设计模式是经验丰富的开发者们总结出的解决常见问题的模板或最佳实践。工厂模式作为其中的一种,是对象创建型模式,它的主要目的是为了隔离对象创建过程与客户端之间的关系,使得创建过程更加灵活,...
Java设计模式之工厂模式(Factory).doc