21
private: }; class AddOperation : public COperation { public: double GetResult() { return first + second; } private: }; class SubOperation : public COperation { public: double GetResult() { return first - second; } private: }; class CCalculatorFactory { public: static COperation*CreateOperation(char cOperator) { COperation * tmp = NULL; switch(cOperator) { case '+': tmp = new AddOperation(); break; case '-': tmp = new SubOperation(); break; default: tmp = NULL; } return tmp; } }; 22
void main() { COperation *op1 = CCalculatorFactory::CreateOperation('+'); op1->first = 10; op1->second = 20; cout< 2.3.1概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。 2.3.2类图角色和职责 抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口。 具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化产品对象。 抽象(Product)角色 工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。 具体产品(Concrete Product)角色 工厂方法模式所创建的具体实例对象 23 2.3.3工厂方法模式和简单工厂模式比较 工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。 “开放-封闭”通过添加代码的方式,不是通过修改代码的方式完成功能的增强。 #include %using namespace std; 24 class Fruit { public: virtual void sayname() { cout<<\ } }; class FruitFactory { public: virtual Fruit* getFruit() { return new Fruit(); } }; //香蕉 class Banana : public Fruit { public: virtual void sayname() { cout<<\ } }; //香蕉工厂 class BananaFactory : public FruitFactory { public: virtual Fruit* getFruit() { return new Banana; } }; //苹果 class Apple : public Fruit { 25 public: virtual void sayname() { cout<<\ } }; //苹果工厂 class AppleFactory : public FruitFactory { public: virtual Fruit* getFruit() { return new Apple; } }; void main() { FruitFactory * ff = NULL; Fruit *fruit = NULL; //1 ff = new BananaFactory(); fruit = ff->getFruit(); fruit->sayname(); delete fruit; delete ff; } //2苹果 ff = new AppleFactory(); fruit = ff->getFruit(); fruit->sayname(); delete fruit; delete ff; cout<<\system(\