

考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观。如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。


///
// Factory.cpp
// Implementation of the Class Factory
// Created on: 01-十月-2014 18:41:33
// Original author: colin
///
#include "Factory.h"
#include "ConcreteProductA.h"
#include "ConcreteProductB.h"
Product* Factory::createProduct(string proname){
if ( "A" == proname )
{
return new ConcreteProductA();
}
else if("B" == proname)
{
return new ConcreteProductB();
}
return NULL;
}
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
locale);
获取不同加密算法的密钥生成器:
KeyGenerator keyGen=KeyGenerator.getInstance("DESede");
创建密码器:
Cipher cp=Cipher.getInstance("DESede");
创建型模式关注对象的创建过程,在软件开发中应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象过程中无须关心对象的创建细节,从而降低系统耦合度,并且让系统易于修改和扩展。
简单工厂模式是最简单的设计模式之一,其实它并不属于Gof的23种设计模式,但应用也十分频繁,同时也是其余创建模式的基础,因此有必要先学习简单工厂模式。

什么是简单工厂模式呢?举个例子:如上图,一个体育用品生产厂(这即是一个工厂Factory),该工厂可以根据客户需求生产篮球、足球和排球。篮球、足球和排球被成为产品(Product),产品的名称可以被成为参数。客户Jungle需要时可以向工厂提供产品参数,工厂根据产品参数生产对应产品,客户Jungle并不需要关心产品的生产过程细节。
简单工厂模式:定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类

//抽象产品类AbstractProduct
class AbstractProduct
{
public:
//抽象方法:
};
//具体产品类Basketball
class ConcreteProduct :public AbstractProduct
{
public:
//具体实现方法
};
class Factory
{
public:
AbstractProduct createProduct(string productName)
{
AbstractProduct pro = NULL;
if (productName == "ProductA"){
pro = new ProductA();
}
else if (productName == "ProductB"){
pro = new ProductB();
}
...
}
};
客户端在使用时,只需要创建一个工厂对象,调用工厂对象的createProduct方法,并传入所需要的产品参数,即可得到所需产品实例对象,而无需关心产品的创建细节。
考虑有以下一个场景:
Jungle想要进行户外运动,它可以选择打篮球、踢足球或者玩排球。它需要凭票去体育保管室拿,票上写着一个具体球类运动的名字,比如“篮球”。体育保管室负责人根据票上的字提供相应的体育用品。然后Jungle就可以愉快地玩耍了。
我们采用简单工厂模式来实现上述场景。首先,体育保管室是工厂,篮球、足球和排球是具体的产品,而抽象产品可以定义为“运动球类产品SportProduct”.Jungle作为客户只需要提供具体产品名字,工厂就可“生产”出对应产品。
//抽象产品类AbstractProduct
class AbstractSportProduct
{
public:
AbstractSportProduct(){
}
virtual ~AbstractSportProduct(){};
//抽象方法:
// virtual void printName(){};
virtual void printName() = 0;
// virtual void play(){};
virtual void play() = 0;
};
//具体产品类Basketball
class Basketball :public AbstractSportProduct
{
public:
Basketball(){
printName();
play();
}
~Basketball()
{
}
//具体实现方法
void printName(){
printf("Jungle get Basketball\n");
}
void play(){
printf("Jungle play Basketball\n");
}
};
//具体产品类Football
class Football :public AbstractSportProduct
{
public:
Football(){
printName();
play();
}
~Football()
{
}
//具体实现方法
void printName(){
printf("Jungle get Football\n");
}
void play(){
printf("Jungle play Football\n");
}
};
//具体产品类Volleyball
class Volleyball :public AbstractSportProduct
{
public:
Volleyball(){
printName();
play();
}
~Volleyball()
{
}
//具体实现方法
void printName(){
printf("Jungle get Volleyball\n");
}
void play(){
printf("Jungle play Volleyball\n");
}
};
class Factory
{
public:
std::shared_ptr<AbstractSportProduct> getSportProduct(string productName)
{
std::shared_ptr<AbstractSportProduct> pro;
if (productName == "Basketball"){
pro = std::shared_ptr<AbstractSportProduct>(new Basketball());
}
else if (productName == "Football"){
pro = std::shared_ptr<AbstractSportProduct>(new Football());
}
else if (productName == "Volleyball"){
pro = std::shared_ptr<AbstractSportProduct>(new Volleyball());
}
return pro;
}
};
#include <iostream>
#include <memory>
#include "SimpleFactory.h"
int main()
{
printf("简单工厂模式\n");
//定义工厂类对象
std::shared_ptr<Factory> fac = std::make_shared<Factory>();
// std::shared_ptr<AbstractSportProduct> product = std::shared_ptr<AbstractSportProduct>(fac->getSportProduct("Basketball"));
std::shared_ptr<AbstractSportProduct> product = fac->getSportProduct("Basketball");
fac = std::make_shared<Factory>();
product = fac->getSportProduct("Football");
// product = std::shared_ptr<AbstractSportProduct>(fac->getSportProduct("Football"));
fac = std::make_shared<Factory>();
product = fac->getSportProduct("Volleyball");
// product = std::shared_ptr<AbstractSportProduct>(fac->getSportProduct("Volleyball"));
#ifdef win32
system("pause");
#endif
return 0;
}

简单工厂模式的优点在于:
当然,简单工厂模式存在明显的不足(想想我们之前介绍的面向对象设计原则???)。假设有一天Jungle想玩棒球了,该怎么办呢?你肯定会说,这还不容易吗?再从抽象产品类派生出一个Baseball类,并在工厂类的getSportProduct方法中增加“productName == "Baseball”的条件分支即可。的确如此,但是这明显违背了开闭原则(对扩展开放,对修改关闭),即在扩展功能时修改了既有的代码。另一方面,简单工厂模式所有的判断逻辑都在工厂类中实现,一旦工厂类设计故障,则整个系统都受之影响!
以上就是今天要讲的内容,本文详细介绍了设计模式中创建型模式之简单工厂模式( Simple Factory Pattern )介绍和使用,简单工厂模式设计模式的使用,,设计模式提供了大量的方法供我们使用,非常的便捷,我们务必掌握。希望大家多多支持!另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。加油啊!
