一、
Simple Factory
为了把事情说清楚,为了对自己的学习负责,偶不得不加一个
disgusted
所谓的“前言”。
这里,就先了解一下
Factory Method
模式的老爸
: Simple Factory
。
Simple Factory
属于类的创建型模式,它根据外界给定信息,让
Factory
来制造所需的产品。工厂对象能够生产的具体产品类
(ConcreteProduct)
通常继承同一个父产品类
(Product)
,实现(覆盖)接口方法。
Simple Factory
的基本结构如图:
简单工厂的实质是有一个工厂类根据传入的参数,动态的生成所需的具体产品对象。上图中体现了这个模式的三个角色:
-
工厂 (Creator ,上图中的 ProductFactory) : Simple Facory 的核心,负责创建所需产品对象。
-
抽象产品 (Product) :所有具体产品类的父类,它负责描述所有实例公共的接口。
-
具体产品 (Concrete Product) :具体的产品类,工厂所创建的真正实例。
说了半天废话,还是举例实在一点。
A.
定义一个手机抽象类
(Product)
classMobile
{
public :
virtual void call() = 0 ; // Make a call
virtual void shortMsg() = 0 ; // Send adn receive short message
};
{
public :
virtual void call() = 0 ; // Make a call
virtual void shortMsg() = 0 ; // Send adn receive short message
};
B.
2
个具体的产品(
Concrete Product
)
--Nokia
和
Moto
的手机
class
NokiaPhone : publicMobile
{
virtual void call() { cout << " Nokia calling " << endl; }
virtual void shortMsg() { cout << " Nokia short message " << endl; }
};
class MotoPhone : publicMobile
{
virtual void call() { cout << " Moto calling " << endl; }
virtual void shortMsg() { cout << " Moto short message " << endl; }
};
{
virtual void call() { cout << " Nokia calling " << endl; }
virtual void shortMsg() { cout << " Nokia short message " << endl; }
};
class MotoPhone : publicMobile
{
virtual void call() { cout << " Moto calling " << endl; }
virtual void shortMsg() { cout << " Moto short message " << endl; }
};
C.
接下来是买手机过程类,相当于一个
Factory;
class
MobileShop
{
public :
Mobile * buyPhone(string brand);
void returnPhone( Mobile * phone); // 最好有一个销毁产品的方法。
};
Mobile * MobileShop:: buyPhone(string brand)
{
if (brand == " Moto " )
return ( new MotoPhone());
if (brand == " Nokia " )
return ( new NokiaPhone());
else
{
cout << " No such brand " << endl;
return NULL;
}
}
void MobileShop::returnPhone(Mobile * phone)
{
if (phone != NULL)
delete(phone);
return ;
}
{
public :
Mobile * buyPhone(string brand);
void returnPhone( Mobile * phone); // 最好有一个销毁产品的方法。
};
Mobile * MobileShop:: buyPhone(string brand)
{
if (brand == " Moto " )
return ( new MotoPhone());
if (brand == " Nokia " )
return ( new NokiaPhone());
else
{
cout << " No such brand " << endl;
return NULL;
}
}
void MobileShop::returnPhone(Mobile * phone)
{
if (phone != NULL)
delete(phone);
return ;
}
D.
现在各种角色都齐了,如果一个客户想买一个手机,就可以这样:
int
main()
{
MobileShop shop;
Mobile * nokia = shop.buyPhone( " Nokia " );
Mobile * moto = shop.buyPhone( " Moto " );
//现在用手机打电话,发短信
nokia -> call();
nokia -> shortMsg();
moto -> call();
moto -> shortMsg();
shop.returnPhone(nokia);
shop.returnPhone(moto);
}
{
MobileShop shop;
Mobile * nokia = shop.buyPhone( " Nokia " );
Mobile * moto = shop.buyPhone( " Moto " );
//现在用手机打电话,发短信
nokia -> call();
nokia -> shortMsg();
moto -> call();
moto -> shortMsg();
shop.returnPhone(nokia);
shop.returnPhone(moto);
}
由上面的代码示例可以看出:
1.
客户想要购买一个手机(生产一个产品),就找手机商店(
MobileShop
),告诉商店要
Moto
的手机还是
Nokia
的。
2.
商店必须知道它有哪些牌子的商品,如何创建这些商品。如果商店希望提供新的牌子(例如
SonyEricsson
)的产品,必须修改商店,在
buyMobile
方法中新添
SonyEricsson
的生产过程。