一、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的生产过程。