设计模式Before-after之简单工厂模式
2014-03-10 13:14
253 查看
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"
#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"
相关文章推荐
- Linux上最优秀的数据恢复工具
- 老公是个二货,总能逗笑我
- ZOJ 3605 Find the Marble(三维dp)
- 【电子新发现】仿真软件LTspice和小体积贴片式升压变压器
- 配置Oracle dbconsole的密钥
- 创业公司和求职者都应看的九个面试题
- codeforces 400D - Dima and Bacteria
- sql乱码问题
- 瘦腿方法
- ASP.NET的Cookie
- eclipse +tomcat 远程调试
- C#的异常
- 落后的就算做到极致也是落后的
- MyEclipse引入js文件,报错invalid Regular Expression Options
- 关于常见排序算法的稳定性分析和结论(转载)
- svn - 常用命令
- OSPF系列
- 2014 0310 李家振
- 算法概论第一次作业
- Entity FrameWork(EF)6.0.2 增删修读(READ)的操作实现