虽不能至,心向往之

—— 巴人也,操C++口音,混迹于京师,勉强度日……《史记·corelito列传》
posts - 8, comments - 15, trackbacks - 0, articles - 0
sourcemaking 上关于抽象工厂方法的例子代码,个人感觉非常利于理解,看看这些代码,比读几遍书貌似有效果的多~~~

 1 #include <iostream.h>
 2 
 3 class Shape {
 4   public:
 5     Shape() {
 6       id_ = total_++;
 7     }
 8     virtual void draw() = 0;
 9   protected:
10     int id_;
11     static int total_;
12 };
13 int Shape::total_ = 0;
14 
15 class Circle : public Shape {
16   public:
17     void draw() {
18       cout << "circle " << id_ << ": draw" << endl;
19     }
20 };
21 class Square : public Shape {
22   public:
23     void draw() {
24       cout << "square " << id_ << ": draw" << endl;
25     }
26 };
27 class Ellipse : public Shape {
28   public:
29     void draw() {
30       cout << "ellipse " << id_ << ": draw" << endl;
31     }
32 };
33 class Rectangle : public Shape {
34   public:
35     void draw() {
36       cout << "rectangle " << id_ << ": draw" << endl;
37     }
38 };
39 
40 class Factory {
41   public:
42     virtual Shape* createCurvedInstance() = 0;
43     virtual Shape* createStraightInstance() = 0;
44 };
45 
46 class SimpleShapeFactory : public Factory {
47   public:
48     Shape* createCurvedInstance() {
49       return new Circle;
50     }
51     Shape* createStraightInstance() {
52       return new Square;
53     }
54 };
55 class RobustShapeFactory : public Factory {
56   public:
57     Shape* createCurvedInstance()   {
58       return new Ellipse;
59     }
60     Shape* createStraightInstance() {
61       return new Rectangle;
62     }
63 };
64 
65 int main() {
66 #ifdef SIMPLE
67   Factory* factory = new SimpleShapeFactory;
68 #elif ROBUST
69   Factory* factory = new RobustShapeFactory;
70 #endif
71   Shape* shapes[3];
72 
73   shapes[0= factory->createCurvedInstance();   // shapes[0] = new Ellipse;
74   shapes[1= factory->createStraightInstance(); // shapes[1] = new Rectangle;
75   shapes[2= factory->createCurvedInstance();   // shapes[2] = new Ellipse;
76 
77   for (int i=0; i < 3; i++) {
78     shapes[i]->draw();
79   }
80 }

输出为:

ellipse 0: draw
rectangle 
1: draw
ellipse 
2: draw



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理