抽象工厂模式

来源:互联网 发布:中小学教师网络培训 编辑:程序博客网 时间:2024/06/07 03:25

写好的代码就是为了以后少写一些代码。

一个土豪家给儿子相亲,门口排了一溜儿的美女,几十个吧。土豪超级有钱,说了:要房要车都没问题,只要你们提的出来,老子就能买的起。这房和车就是两类抽象内容,车有宝马、奔驰、桑塔纳、爱丽舍等几十种;房子有城市公寓、郊区豪宅、乡间大别墅、京城四合院等几十种。每位美女可以提出来一种组合,比如京城四合院+爱丽舍、乡间大别墅+宝马等等。关键就是那个抽象工厂,美女只要提要求,管家就按照要求来安排。每种组合就算是一种产品吧。只要提出来组合管家很容易列个账单来实现功能,但是有个奇葩的女孩说了,只有房和车可不行,我得要首饰。这样管家就不好做了,管家说我要是把首饰给你加上去不要紧,老爷的采购团队得把每个美女的账单全部更改呀。所以我不太愿意给你加首饰。

上面就说了抽象工厂的使用方法:每个美女都可以提出来一个房车组合,管家添加一个账单就OK了,但是你让管家再账单上添加一个项目,管家就不愿意了。

C++示例代码:

// 婚车.h#pragma once#include <string>using namespace std;class 婚车{public:婚车() {}~婚车() {}virtual string 报车型() = 0;};// 宝马.h#pragma once#include "婚车.h"class 宝马 : public 婚车{public:宝马() {}virtual ~宝马() {}string 报车型() { return "宝马"; }};// 奔驰.h#pragma once#include "婚车.h"class 奔驰 : public 婚车{public:奔驰() {}virtual ~奔驰() {}string 报车型() { return "奔驰"; }};// 桑塔纳.h#pragma once#include "婚车.h"class 桑塔纳 :public 婚车{public:桑塔纳() {}virtual ~桑塔纳() {}string 报车型() { return "桑塔纳"; }};// 爱丽舍.h#pragma once#include "婚车.h"class 爱丽舍 :public 婚车{public:爱丽舍() {}virtual ~爱丽舍() {}string 报车型() { return "爱丽舍"; }};// 婚房.h#pragma once#include <string>using namespace std;class 婚房{public:婚房() {}virtual ~婚房() {}virtual string 报房型() = 0;};// 城市公寓.h#pragma once#include "婚房.h"class 城市公寓 :public 婚房{public:城市公寓() {}virtual ~城市公寓() {}string 报房型() { return "城市公寓"; }};// 郊区豪宅.h#pragma once#include "婚房.h"class 郊区豪宅 :public 婚房{public:郊区豪宅() {}virtual ~郊区豪宅() {}string 报房型() { return "郊区豪宅"; }};// 京城四合院.h#pragma once#include "婚房.h"class 京城四合院 :public 婚房{public:京城四合院() {}virtual ~京城四合院() {}string 报房型() { return "京城四合院"; }};// 乡村大别墅.h#pragma once#include "婚房.h"class 乡村大别墅 :public 婚房{public:乡村大别墅() {}virtual ~乡村大别墅() {}string 报房型() { return "乡间大别墅"; }};// 婚车购置员.h#pragma once#include "婚车.h"class 婚车购置员{public:婚车购置员() {}virtual ~婚车购置员() {}virtual 婚车* 购置() = 0;};// 爱丽舍购置.h#pragma once#include "婚车购置员.h"#include "婚车.h"class 爱丽舍购置 :public 婚车购置员{public:爱丽舍购置() {}virtual ~爱丽舍购置() {}婚车* 购置(){婚车* car = new 爱丽舍();cout << "土豪购置了婚车" << car->报车型() << endl;return car;}};// 宝马购置.h#pragma once#include "婚车购置员.h"#include "婚车.h"class 宝马购置 :public 婚车购置员{public:宝马购置() {}virtual ~宝马购置() {}婚车* 购置(){婚车* car = new 宝马();cout << "土豪购置了婚车" << car->报车型() << endl;return car;}};// 奔驰购置.h#pragma once#include "婚车购置员.h"#include "婚车.h"class 奔驰购置 :public 婚车购置员{public:奔驰购置() {}virtual ~奔驰购置() {}婚车* 购置(){婚车* car = new 奔驰();cout << "土豪购置了婚车" << car->报车型() << endl;return car;}};// 桑塔纳购置.h#pragma once#include "婚车购置员.h"#include "婚车.h"class 桑塔纳购置 :public 婚车购置员{public:桑塔纳购置() {}virtual ~桑塔纳购置() {}婚车* 购置(){婚车* car = new 桑塔纳();cout << "土豪购置了婚车" << car->报车型() << endl;return car;}};// 婚房购置员.h#pragma once#include "婚房.h"class 婚房购置员{public:婚房购置员() {}virtual ~婚房购置员() {}virtual 婚房* 购置() = 0;};// 城市公寓购置.h#pragma once#include "婚房购置员.h"#include "婚房.h"class 城市公寓购置 :public 婚房购置员{public:城市公寓购置() {}virtual ~城市公寓购置() {}婚房* 购置(){婚房* house = new 城市公寓();cout << "土豪购置了" << house->报房型() << endl;return house;}};// 郊区豪宅购置.h#pragma once#include "婚房购置员.h"#include "婚房.h"class 郊区豪宅购置 :public 婚房购置员{public:郊区豪宅购置() {}virtual ~郊区豪宅购置() {}婚房* 购置(){婚房* house = new 郊区豪宅();cout << "土豪购置了" << house->报房型() << endl;return house;}};// 京城四合院购置.h#pragma once#include "婚房购置员.h"class 京城四合院购置 :public 婚房购置员{public:京城四合院购置() {}virtual ~京城四合院购置() {}婚房* 购置(){婚房* house = new 京城四合院();cout << "土豪购置了" << house->报房型() << endl;return house;}};// 乡村大别墅购置.h#pragma once#include "婚房购置员.h"#include "婚房.h"class 乡村大别墅购置 :public 婚房购置员{public:乡村大别墅购置() {}virtual ~乡村大别墅购置() {}婚房* 购置(){婚房* house = new 乡村大别墅();cout << "土豪购置了" << house->报房型() << endl;return house;}};// 管家.h#include "婚车购置员.h"class 管家{public:管家(string name);virtual ~管家();void 购置婚车(婚车购置员* car_buyer);void 购置婚房(婚房购置员* house_buyer);void 打印美女需求();婚车* car;婚房* hourse;string name;};// 管家.cpp#include "stdafx.h"#include "管家.h"#include <iostream>using namespace std;管家::管家(string name){car = nullptr;hourse = nullptr;this->name = name;}管家::~管家(){if (car){delete car;car = nullptr;}if (hourse){delete hourse;hourse = nullptr;}}void 管家::购置婚车(婚车购置员* car_buyer){car = car_buyer->购置();}void 管家::购置婚房(婚房购置员* house_buyer){hourse = house_buyer->购置();}void 管家::打印美女需求(){cout << name << "需要土豪购买" << hourse->报房型() << "婚房和" << car->报车型() << "婚车。" << endl;}// 美女一的条件.h#pragma once#include "管家.h"class 美女一的条件 :public 管家{public:美女一的条件() { 管家("美女一"); }virtual ~美女一的条件() {}};// 美女二的条件.h#pragma once#include "管家.h"class 美女二的条件 :public 管家{public:美女二的条件() { 管家("美女二"); }virtual ~美女二的条件() {}};// 美女三的条件.h#pragma once#include "管家.h"class 美女三的条件 :public 管家{public:美女三的条件() { 管家("美女三"); }virtual ~美女三的条件() {}};// 相亲流程// 抽象工厂.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "管家.h"#include "美女一的条件.h"#include "美女二的条件.h"#include "美女三的条件.h"#include "婚车购置员.h"#include "爱丽舍购置.h"#include "桑塔纳购置.h"#include "奔驰购置.h"#include "宝马购置.h"#include "婚房购置员.h"#include "京城四合院购置.h"#include "城市公寓购置.h"#include "乡村大别墅购置.h"#include "郊区豪宅购置.h"int _tmain(int argc, _TCHAR* argv[]){// 美女一的要求管家* mv1 = new 美女一的条件();婚车购置员* car_mv1 = new 宝马购置();mv1->购置婚车(car_mv1);婚房购置员* house_mv1 = new 京城四合院购置();mv1->购置婚房(house_mv1);mv1->打印美女需求();delete mv1;delete car_mv1;delete house_mv1;// 美女二的要求管家* mv2 = new 美女一的条件();婚车购置员* car_mv2 = new 爱丽舍购置();mv2->购置婚车(car_mv2);婚房购置员* house_mv2 = new 郊区豪宅购置();mv2->购置婚房(house_mv2);mv2->打印美女需求();delete mv2;delete car_mv2;delete house_mv2;// 美女三的要求,可以随意组合管家* mv3 = new 美女一的条件();婚车购置员* car_mv3 = new 奔驰购置();mv3->购置婚车(car_mv3);婚房购置员* house_mv3 = new 乡村大别墅购置();mv3->购置婚房(house_mv3);mv3->打印美女需求();delete mv3;delete car_mv3;delete house_mv3;// 美女四:来件首饰怎么样?管家说:滚蛋,下一位!return 0;}

C#代码:

/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:02 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 婚房./// </summary>public interface 婚房{string 报房型();}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:43 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 城市公寓./// </summary>public class 城市公寓 : 婚房{public 城市公寓(){}public string 报房型(){return "城市公寓";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:38 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 郊区豪宅./// </summary>public class 郊区豪宅 : 婚房{public 郊区豪宅(){}public string 报房型(){return "郊区豪宅";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:26 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 京城四合院./// </summary>public class 京城四合院 : 婚房{public 京城四合院(){}public string 报房型(){return "京城四合院";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:32 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 乡村大别墅./// </summary>public class 乡村大别墅 : 婚房{public 乡村大别墅(){}public string 报房型(){return "乡村大别墅";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:02 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 婚房购置./// </summary>public interface 婚房购置{婚房 购置();}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:44 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 城市公寓购置./// </summary>public class 城市公寓购置 : 婚房购置{public 城市公寓购置(){}public 婚房 购置(){婚房 house = new 城市公寓();Console.WriteLine("土豪购置了婚房:{0}", house.报房型());return house;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:40 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 郊区豪宅购置./// </summary>public class 郊区豪宅购置 : 婚房购置{public 郊区豪宅购置(){}public 婚房 购置(){婚房 house = new 郊区豪宅();Console.WriteLine("土豪购置了婚房:{0}", house.报房型());return house;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:27 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 京城四合院购置./// </summary>public class 京城四合院购置 : 婚房购置{public 京城四合院购置(){}public 婚房 购置(){婚房 house = new 京城四合院();Console.WriteLine("土豪购置了婚房:{0}", house.报房型());return house;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:33 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 乡村大别墅购置./// </summary>public class 乡村大别墅购置 : 婚房购置{public 乡村大别墅购置(){}public 婚房 购置(){婚房 house = new 乡村大别墅();Console.WriteLine("土豪购置了婚房:{0}", house.报房型());return house;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:01 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 婚车./// </summary>public interface 婚车{string 报车型();}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:19 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 爱丽舍./// </summary>public class 爱丽舍 : 婚车{public 爱丽舍(){}public string 报车型(){return "爱丽舍";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:17 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 宝马./// </summary>public class 宝马 : 婚车{public 宝马(){}public string 报车型(){return "宝马";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:15 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 奔驰./// </summary>public class 奔驰 : 婚车{public 奔驰(){}public string 报车型(){return "奔驰";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:18 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 桑塔纳./// </summary>public class 桑塔纳 : 婚车{public 桑塔纳(){}public string 报车型(){return "桑塔纳";}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:03 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 婚车购置./// </summary>public interface 婚车购置{婚车 购置();}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:25 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 爱丽舍购置./// </summary>public class 爱丽舍购置 : 婚车购置{public 爱丽舍购置(){}public 婚车 购置(){婚车 car = new 爱丽舍();Console.WriteLine("土豪购置了婚车:{0}", car.报车型());return car;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:20 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 宝马购置./// </summary>public class 宝马购置 : 婚车购置{public 宝马购置(){}public 婚车 购置(){婚车 car = new 宝马();Console.WriteLine("土豪购置了婚车:{0}", car.报车型());return car;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:22 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 奔驰购置./// </summary>public class 奔驰购置 : 婚车购置{public 奔驰购置(){}public 婚车 购置(){婚车 car = new 奔驰();Console.WriteLine("土豪购置了婚车:{0}", car.报车型());return car;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:22 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 桑塔纳购置./// </summary>public class 桑塔纳购置 : 婚车购置{public 桑塔纳购置(){}public 婚车 购置(){婚车 car = new 桑塔纳();Console.WriteLine("土豪购置了婚车:{0}", car.报车型());return car;}}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:11 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 美女要求./// </summary>public interface 美女要求{void 满足美女要求();void 婚房购置清单(婚房购置 清单);void 婚车购置清单(婚车购置 清单);}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:45 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 美女一要求./// </summary>public class 美女一要求 : 美女要求{public 美女一要求(){}public void 满足美女要求(){Console.WriteLine("土豪应美女一的要求购置了{0}和{1}", car.报车型(), house.报房型());}public void 婚房购置清单(婚房购置 清单){house = 清单.购置();}public void 婚车购置清单(婚车购置 清单){car = 清单.购置();}private 婚车 car;private 婚房 house;}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:58 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 美女二要求./// </summary>public class 美女二要求 : 美女要求{public 美女二要求(){}public void 满足美女要求(){Console.WriteLine("土豪应美女二的要求购置了{0}和{1}", car.报车型(), house.报房型());}public void 婚房购置清单(婚房购置 清单){house = 清单.购置();}public void 婚车购置清单(婚车购置 清单){car = 清单.购置();}private 婚车 car;private 婚房 house;}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/8 * 时间: 9:59 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{/// <summary>/// Description of 美女三要求./// </summary>public class 美女三要求 : 美女要求{public 美女三要求(){}public void 满足美女要求(){Console.WriteLine("土豪应美女三的要求购置了{0}和{1}", car.报车型(), house.报房型());}public void 婚房购置清单(婚房购置 清单){house = 清单.购置();}public void 婚车购置清单(婚车购置 清单){car = 清单.购置();}private 婚车 car;private 婚房 house;}}/* * 由SharpDevelop创建。 * 用户: hangba * 日期: 2016/3/7 * 时间: 15:34 *  * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */using System;namespace 抽象工厂模式{class Program{public static void Main(string[] args){// 美女一要求买京城四合院+奔驰车美女要求 mv1 = new 美女一要求();mv1.婚房购置清单(new 京城四合院购置());mv1.婚车购置清单(new 奔驰购置());mv1.满足美女要求();// 美女二要求买乡村大别墅+桑塔纳车美女要求 mv2 = new 美女二要求();mv2.婚房购置清单(new 乡村大别墅购置());mv2.婚车购置清单(new 桑塔纳购置());mv2.满足美女要求();// 美女一要求买城市公寓+爱丽舍车美女要求 mv3 = new 美女三要求();mv3.婚房购置清单(new 城市公寓购置());mv3.婚车购置清单(new 爱丽舍购置());mv3.满足美女要求();// 美女四要求首饰,土豪说滚蛋吧,下一位美女。Console.Write("Press any key to continue . . . ");Console.ReadKey(true);}}}



0 0