您的位置:首页 > 其它

设计模式Before-after之简单工厂模式

2014-03-10 13:14 225 查看
before.cxx

#include <iostream>
#include <string>

class Apple {
public:
void sayHello(void) {
std::cout << "Hello, I'm a apple." << std::endl;
}
};

class Banana {
public:
void sayHello(void) {
std::cout << "Hello, I'm a banana." << std::endl;
}
};

class Pear {
public:
void sayHello(void) {
std::cout << "Hello, I'm a pear." << std::endl;
}
};

int main(void) {
Apple apple;
apple.sayHello();

// Banana banana;
// banana.sayHello();

// Pear pear;
// pear.sayHello();
return 0;
}


after.cxx
#include <iostream>
#include <string>
#include "config.hxx"

class Fruit {
public:
virtual void sayHello(void) = 0;
};

class Apple: public Fruit {
void sayHello(void) {
std::cout << "Hello, I'm a apple." << std::endl;
}
};

class Banana: public Fruit {
public:
void sayHello(void) {
std::cout << "Hello, I'm a banana." << std::endl;
}
};

class Pear: public Fruit {
public:
void sayHello(void) {
std::cout << "Hello, I'm a pear." << std::endl;
}
};

class FruitFactory {
public:
Fruit *createFruit(const std::string &fruitName) {
Fruit *fruit;
if (!fruitName.compare("Apple")) {
fruit = new Apple();
} else if (!fruitName.compare("Banana")) {
fruit = new Banana();
} else if (!fruitName.compare("Pear")) {
fruit = new Pear();
} else {
throw std::invalid_argument("invalid fruit name: " + fruitName);
}
return fruit;
}
};

int main(void) {
try {
FruitFactory fruitFactory;
Fruit *fruit = fruitFactory.createFruit(_FRUIT_NAME_);
fruit->sayHello();
delete fruit;
} catch(const std::exception &e) {
std::cerr << e.what() << std::endl;
}
return 0;
}


config.hxx
#define _FRUIT_NAME_ "Apple"

// #define _FRUIT_NAME_ "Banana"

// #define _FRUIT_NAME_ "Pear"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: