#include <iostream>
#include <string.h>
using namespace std;
/*
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象
简单工厂模式的优缺点:工厂类是整个模式的核心。它包含必要的逻辑,根据外界给定的信息决定究竟应
该创建哪个具体的对象。用户在使用时可以直接根据工厂去创建所需的实例,而不需了解对象是如何创建
以及如何组织的。有利于整个软件体系结构的优化。
缺点:工厂类集中了所有实例的创建逻辑,所以高内聚方面不友好,当系统中具体的产品不断的增加时,
可能要去工厂类也要做相应的修改,扩展性并不好;
*/
class CFruit{
public:
//负责描述所有实例的公共接口
virtual void getfruit() = 0;
};
//具体产品类
class CApple:public CFruit
{
public:
virtual void getfruit()
{
cout<<"apple"<<endl;
}
};
//具体产品类
class CBnanal:public CFruit
{
public:
virtual void getfruit()
{
cout<<"bnanal"<<endl;
}
};
//工厂类
class CFactory{
public:
//对外提供生成具体产品实例对象的方法
static CFruit* create_product(const char* pname)
{
CFruit* tmp = NULL;
if (strcmp(pname, "apple") == 0)
{
tmp = new CApple();
}
else if (strcmp(pname, "bnanal") == 0)
{
tmp = new CBnanal();
}
else
{
return NULL;
}
return tmp;
}
};
int main()
{
CFactory fact;
CFruit* ft = fact.create_product("apple");
if (ft)
{
ft->getfruit();
}
ft = fact.create_product("bnanal");
if (ft)
{
ft->getfruit();
}
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
/*
工厂方法模式类属于创建型模式,又被称为多态工厂模式
工厂方法模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到
子类当中;
核心工厂类不再负责产品的创建,这样核心工厂类成为一个抽象工厂角色,
仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法
模式可以使系统在不修改具体工厂角色的情况下引进新的产品;
抽象工厂(Creator)角色:
工厂方法模式的核心,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator)角色:
具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
抽象(Product)角色:
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:
工厂方法模式所创建的具体实例对象
*/
class CFruit{
public:
virtual void getfruit() = 0;
};
//抽象工厂类
class CFactory{
public:
virtual CFruit* create_product()=0;
};
//具体产品
class CApple:public CFruit
{
public:
virtual void getfruit()
{
cout<<"apple"<<endl;
}
};
//具体工厂类
class CAppleFactory:public CFactory{
public:
CFruit* create_product()
{
CFruit* ft = new CApple();
return ft;
}
};
//具体产品
class CBanana:public CFruit
{
public:
virtual void getfruit()
{
cout<<"banana"<<endl;
}
};
//具体工厂类
class CBananaFactory:public CFactory{
public:
CFruit* create_product()
{
CFruit* ft = new CBanana();
return ft;
}
};
int main()
{
CAppleFactory apple;
CFruit* ft = apple.create_product();
if (ft)
{
ft->getfruit();
}
CBananaFactory banana;
ft = banana.create_product();
if (ft)
{
ft->getfruit();
}
return 0;
}
工厂模式和简单工厂模式的区别
工厂方法模式与简单工厂模式在结构上的不同不是很明显。
工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,
或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅
需要添加一个具体对象以及一个具体工厂对象,
原有工厂对象不需要进行任何修改,也不需要修改客户端,
很好的符合了“开放-封闭”原则。
而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式退化后可以演变成简单工厂模式。
//抽象工厂模式:可以生产多个产品
#include <iostream>
#include <string.h>
using namespace std;
/*
1.抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
3.抽象(Product)角色
抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色
抽象模式所创建的具体实例对象
工厂模式和抽象工厂模式区别
工厂模式:只能生产一个产品
抽象工厂模式:可以生产一个产品族
*/
class CFruit{
public:
virtual void getfruit() = 0;
};
//具体产品
class CSouthApple:public CFruit
{
public:
virtual void getfruit()
{
cout<<"south apple"<<endl;
}
};
//具体产品
class CNorthApple:public CFruit
{
public:
virtual void getfruit()
{
cout<<"north apple"<<endl;
}
};
//具体产品
class CSouthBanana:public CFruit
{
public:
virtual void getfruit()
{
cout<<"south banana"<<endl;
}
};
//具体产品
class CNorthBanana:public CFruit
{
public:
virtual void getfruit()
{
cout<<"north banana"<<endl;
}
};
//抽象工厂类
class CFruitFactory{
public:
virtual CFruit* create_banana_product()=0;
virtual CFruit* create_apple_product()=0;
};
//具体工厂类
class CNorthFruitFactory:public CFruitFactory{
public:
CFruit* create_banana_product()
{
CFruit* ft = new CNorthBanana();
return ft;
}
CFruit* create_apple_product()
{
CFruit* ft = new CNorthApple();
return ft;
}
};
//具体工厂类
class CSouthFruitFactory:public CFruitFactory{
public:
CFruit* create_banana_product()
{
CFruit* ft = new CSouthBanana();
return ft;
}
CFruit* create_apple_product()
{
CFruit* ft = new CSouthApple();
return ft;
}
};
int main()
{
CNorthFruitFactory nff;
CFruit* ft = nff.create_banana_product();
if (ft)
{
ft->getfruit();
}
CSouthFruitFactory sff;
ft = sff.create_apple_product();
if (ft)
{
ft->getfruit();
}
return 0;
}