设计模式之简单工厂模式(Simple Factory Pattern) 创建型模式
来源:互联网 发布:珊瑚海 周杰伦 知乎 编辑:程序博客网 时间:2024/05/14 11:18
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
简单工厂(Simple Factory)模式
工厂方法(Factory Method)模式
抽象工厂(Abstract Factory)模式
Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。
Simple Factory模式实际上不是GoF 23个设计模式中的一员。
工厂类角色Creator (LightSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。
抽象产品角色Product (Light):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
#ifndef _LIGHT_H_
#define _LIGHT_H_
#include<iostream>
#include<string>
using namespace std;
class Light
{
public:
virtual void turnOn();
virtual void turnOff();
};
class BulbLight:public Light
{
public:
void turnOn();
void turnOff();
};
class TubeLight:public Light
{
public:
void turnOn();
void turnOff();
};
#endif
#include<iostream>
using namespace std;
#include "Light.h"
void Light::turnOn()
{
}
void Light::turnOff()
{
}
void BulbLight::turnOn()
{
cout<<"Bulb Light is turned on"<<endl;
}
void BulbLight::turnOff()
{
cout<<"Bulb Light is turned off"<<endl;
}
void TubeLight::turnOn()
{
cout<<"Tube Light is turned on"<<endl;
}
{
cout<<"Tube Light is turned off"<<endl;
}
#ifndef _LIGHTSIMPLEFACTORY_H_
#define _LIGHTSIMPLEFACTORY_H_
#include "Light.h"
class LightSimpleFactory
{
public:
Light * create(const string & lightType);
};
#endif
#include "LightSimpleFactory.h"
Light* LightSimpleFactory::create(const string & lightType)
{
if(lightType == "Bulb")
return new BulbLight();
else if(lightType == "Tube")
return new TubeLight();
else
return NULL;
}
#include "LightSimpleFactory.h"
void main()
{
string name = "Bulb";
LightSimpleFactory lsf;
Light * l = lsf.create(name);
if(l!=NULL)
l->turnOn();
l->turnOff();
delete l;
}
cout<<"---------------------------"<<endl;
name = "Tube";
l = lsf.create(name);
if(l!=NULL)
l->turnOn();
l->turnOff();
delete l;
}
}
程序举例:
/*--------------------------------------Light.h-----------------------------------------*/
#ifndef _LIGHT_H_
#define _LIGHT_H_
#include<iostream>
#include<string>
using namespace std;
class Light
{
public:
virtual void turnOn();
virtual void turnOff();
static Light * create(const string & lightType);
};
class BulbLight:public Light
{
public:
void turnOn();
void turnOff();
};
class TubeLight:public Light
{
public:
void turnOn();
void turnOff();
};
#endif
/*--------------------------------------------------Light.cpp--------------------------------------*/
#include "Light.h"
void Light::turnOn()
{
}
void Light::turnOff()
{
}
Light* Light::create(const string & lightType)
{
if(lightType == "Bulb")
return new BulbLight();
else if(lightType == "Tube")
return new TubeLight();
else
return NULL;
}
void BulbLight::turnOn()
{
cout<<"Bulb Light is turned on"<<endl;
}
void BulbLight::turnOff()
{
cout<<"Bulb Light is turned off"<<endl;
}
void TubeLight::turnOn()
{
cout<<"Tube Light is turned on"<<endl;
}
void TubeLight::turnOff()
{
cout<<"Tube Light is turned off"<<endl;
}
/*----------------------------------------------main.cpp--------------------------------*/
#include "Light.h"
void main()
{
string name = "Bulb";
Light * l = Light::create(name);
if(l!=NULL)
{
l->turnOn();
l->turnOff();
delete l;
}
cout<<"---------------------------"<<endl;
name = "Tube";
l = Light::create(name);
if(l!=NULL)
{
l->turnOn();
l->turnOff();
delete l;
}
}
Simple Factory模式演化(二)
2)还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。这里的意思为:假设我们在类 A 中要使用到类 B,B 是一个抽象父类
1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中.
Factory模式也带来至少以下两个问题;
1)如果为每一个具体的 ConcreteProduct 类的实例化提供一个函数体,那么我们可能不得不在系统中添加了一个方法来处理这个新建的
2)在实现中我们可以通过参数化工厂方法,即给 FactoryMethod()传递一个参数用以决定是创建具体哪一个具体的 Product 。当然也
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。
Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果我们要为不同的类提供一个对象创建的接口,那就要用AbstractFactory了。
实际使用:
在构造数据库类时,可以用简单工程模式。先抽化出所有数据库操作的公共基类DataBase,比如connect,insert,update,delete等操作,
然后构造实际的数据库类继承改基类,如ORACLE ,SQL SERVER.,TT,DB2,等,最后创建工厂类
- 设计模式之简单工厂模式(Simple Factory Pattern) 创建型模式
- 设计模式(创建型)之简单工厂模式(Simple Factory Pattern)
- 设计模式之简单工厂模式(Simple Factory Pattern)
- JAVA设计模式之 简单工厂模式【Simple Factory Pattern】
- C#设计模式之简单工厂模式(Simple Factory Pattern)
- 设计模式学习笔记--简单工厂模式(Simple Factory Pattern)【创建型模式】
- 设计模式笔记之工厂模式--简单工厂模式(Simple Factory Pattern)
- 设计模式1:Simple Factory Pattern(简单工厂模式)
- c++设计模式:简单工厂模式(Simple Factory Pattern)
- 【JAVA设计模式】简单工厂模式(Simple Factory Pattern)
- 设计模式(1):简单工厂模式(Simple Factory Pattern)
- Java设计模式:简单工厂模式(Simple Factory Pattern)
- Java设计模式--简单工厂模式【Simple Factory Pattern】
- 简单工厂模式(Simple Factory Pattern(静态工厂方法模式)对象创建型模式)
- 创建型模式之简单工厂模式(Simple Factory )
- 【设计模式】之 Simple Factory 简单工厂
- 设计模式之(Simple Factory Pattern--简单工厂模式)
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
- 编程之美:让CPU占用率曲线听你指挥
- Linux 关于动态链接库以及静态链接库的一些概念
- 渲染模块发图记念
- 学习JAVA 第一周
- 《经典算法大全》河内之塔
- 设计模式之简单工厂模式(Simple Factory Pattern) 创建型模式
- Adapter模式
- 一叶障目
- Google Guava学习之Constraint
- 正则基础之——小数点
- 接口没有注册,导致构造的时候出错
- Installed new Ubuntu system
- HTML5新特性
- Android Clipping