抽象工厂模式(Abstract Factory)案例分析
2008-08-20 17:47
176 查看
案例分析:
每台汽车都要有发动机和轮胎等部件,但不同品牌的汽车所用的部件应该是不同的,汽车生产厂可以有不同的生产线,每个生产线负责生产某一型号的汽车部件。例如某厂有两条生产线,一条生产宝马的部件,一条生产宝莱车的部件。客户要买什么车,就启动相应的生产线。
意图:
提供一个创建一系列相关会相互依赖对象的接口,而无须制定他们具体的类。这里结合案例将创建两条生产线,分别生产宝马和宝莱汽车的轮胎和引擎。
结构图:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jia_xiaoxin/EntryImages/20080820/497b1320453684e9cf4b7.jpg)
程序代码:
#include <iostream.h>
class LunTai
{
public:
virtual void display()=0;
};
class YinQing
{
public:
virtual void display()=0;
};
//
class BaoMaCarLunTai:public LunTai
{
public:
void display()
{
cout<<"宝马轮胎!"<<endl;
}
};
class BaoCaiCarLunTai:public LunTai
{
public:
void display()
{
cout<<"宝菜轮胎!"<<endl;
}
};
//
class BaoMaCarYinQing:public YinQing
{
public:
void display()
{
cout<<"宝马引擎!"<<endl;
}
};
class BaoCaiCarYinQing:public YinQing
{
public:
void display()
{
cout<<"宝菜引擎!"<<endl;
}
};
//
class CarFactory
{
public:
virtual LunTai* getCarLunTai()=0;
virtual YinQing* getCarYinQing()=0;
};
class BaoMaCarFactory:public CarFactory
{
public:
LunTai* getCarLunTai()
{
return new BaoMaCarLunTai;
}
YinQing* getCarYinQing()
{
return new BaoMaCarYinQing;
}
};
class BaoCaiCarFactory:public CarFactory
{
public:
LunTai* getCarLunTai()
{
return new BaoCaiCarLunTai;
}
YinQing* getCarYinQing()
{
return new BaoCaiCarYinQing;
}
};
int main()
{
BaoMaCarFactory BaoMaFactory;
BaoMaCarLunTai* BaoMaLunTai=(BaoMaCarLunTai*)BaoMaFactory.getCarLunTai();
BaoMaLunTai->display();
BaoMaCarYinQing* BaoMaYinQing=(BaoMaCarYinQing*)BaoMaFactory.getCarYinQing();
BaoMaYinQing->display();
BaoCaiCarFactory BaoCaiFactory;
BaoCaiCarLunTai* BaoCaiLunTai=(BaoCaiCarLunTai*)BaoCaiFactory.getCarLunTai();
BaoCaiLunTai->display();
BaoCaiCarYinQing* BaoCaiYinQing=(BaoCaiCarYinQing*)BaoCaiFactory.getCarYinQing();
BaoCaiYinQing->display();
return 1;
}
运行结果:
宝马轮胎!
宝马引擎!
宝菜轮胎!
宝菜引擎!
Press any key to continue
每台汽车都要有发动机和轮胎等部件,但不同品牌的汽车所用的部件应该是不同的,汽车生产厂可以有不同的生产线,每个生产线负责生产某一型号的汽车部件。例如某厂有两条生产线,一条生产宝马的部件,一条生产宝莱车的部件。客户要买什么车,就启动相应的生产线。
意图:
提供一个创建一系列相关会相互依赖对象的接口,而无须制定他们具体的类。这里结合案例将创建两条生产线,分别生产宝马和宝莱汽车的轮胎和引擎。
结构图:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jia_xiaoxin/EntryImages/20080820/497b1320453684e9cf4b7.jpg)
程序代码:
#include <iostream.h>
class LunTai
{
public:
virtual void display()=0;
};
class YinQing
{
public:
virtual void display()=0;
};
//
class BaoMaCarLunTai:public LunTai
{
public:
void display()
{
cout<<"宝马轮胎!"<<endl;
}
};
class BaoCaiCarLunTai:public LunTai
{
public:
void display()
{
cout<<"宝菜轮胎!"<<endl;
}
};
//
class BaoMaCarYinQing:public YinQing
{
public:
void display()
{
cout<<"宝马引擎!"<<endl;
}
};
class BaoCaiCarYinQing:public YinQing
{
public:
void display()
{
cout<<"宝菜引擎!"<<endl;
}
};
//
class CarFactory
{
public:
virtual LunTai* getCarLunTai()=0;
virtual YinQing* getCarYinQing()=0;
};
class BaoMaCarFactory:public CarFactory
{
public:
LunTai* getCarLunTai()
{
return new BaoMaCarLunTai;
}
YinQing* getCarYinQing()
{
return new BaoMaCarYinQing;
}
};
class BaoCaiCarFactory:public CarFactory
{
public:
LunTai* getCarLunTai()
{
return new BaoCaiCarLunTai;
}
YinQing* getCarYinQing()
{
return new BaoCaiCarYinQing;
}
};
int main()
{
BaoMaCarFactory BaoMaFactory;
BaoMaCarLunTai* BaoMaLunTai=(BaoMaCarLunTai*)BaoMaFactory.getCarLunTai();
BaoMaLunTai->display();
BaoMaCarYinQing* BaoMaYinQing=(BaoMaCarYinQing*)BaoMaFactory.getCarYinQing();
BaoMaYinQing->display();
BaoCaiCarFactory BaoCaiFactory;
BaoCaiCarLunTai* BaoCaiLunTai=(BaoCaiCarLunTai*)BaoCaiFactory.getCarLunTai();
BaoCaiLunTai->display();
BaoCaiCarYinQing* BaoCaiYinQing=(BaoCaiCarYinQing*)BaoCaiFactory.getCarYinQing();
BaoCaiYinQing->display();
return 1;
}
运行结果:
宝马轮胎!
宝马引擎!
宝菜轮胎!
宝菜引擎!
Press any key to continue
相关文章推荐
- 表面着色器案例分析
- 过滤器应用案例分析
- Struts2系统学习(10)文件上传与下载案例及原理分析
- Starling案例分析——<Hungry Hero>资源管理
- 个人作业2--英语学习app案例分析
- 案例分析
- 《大型网站技术架构--核心原理与案例分析》学有所得
- 个人作业2————英语学习APP的案例分析
- 个人作业2——英语学习APP案例分析
- 个人作业2--英语学习app案例分析
- css案例分析
- 个人作业2——英语学习APP的案例分析
- 个人作业2——英语学习APP案例分析
- 个人作业2——英语学习APP案例分析(必应词典的使用)
- 个人作业2——英语学习APP的案例分析
- Android activity动画跳转案例分析
- 第4周 Redis使用场景与案例分析
- iptables DNAT功能介绍及案例分析
- 个人作业2---必应词典案例分析
- [Oracle 11g r2(11.2.0.4.0)]案例分析4-由gipc 进程导致的节点无法启动