讲个故事吧。从前一个老板非常有钱,非常喜欢数码产品手机,经常喜欢买智能手机,那么怎么买?当然,可以自己去各个手机店买,比如去苹果店,三星店买。但是老板是非常忙的,怎么办?老板是程序员出生。面向对象嘛。加个层次,叫秘书去买,把要买的型号,写张纸条给秘书即可。为什么这样做,对老板来说当然省事了,直接窃取秘书的劳动成果即可(因为付薪水了嘛)。秘书根据老板的指示去做,要买什么牌子手机就去相应的专卖店买即可。OK,这样应付了一段时间,因为这个时期智能手机刚刚兴起,也就几家可以做。
时光飞逝,岁月如梭。随着科技的进步,智能手机市场太大,至于处于一个智能手机的元年,用某人的话说“风口上,猪都能飞起来”。所以,一大批智能手机厂商出现,一大批智能手机品牌出现,但是这个老板从喜欢买智能手机到喜欢收集研究智能手机了,因为土豪嘛,不差钱。所以知道哪里又出款手机了,就叫秘书去买,天啊。这下可忙坏了秘书,要知道,世上的智能手机品牌这么多,秘书的工作现在负担变得更重了,不光要负责公司各种会议,还要天天出去买手机,心里甚是不爽。当然,老板看在眼里,就加了秘书的工资,并且给秘书配了几个同事协助秘书买智能手机这件事。秘书加薪了又有同事一起来分担,秘书这下爽了,这是要升职加薪充当CEO迎娶高富帅的节奏啊,顿时高兴起来了。而且秘书又是总管。老板要买什么新品牌手机,都是跟秘书先说,然后秘书在去分配其他同事分头去买。当然为此老板需要多些人工费,土豪嘛,这能有几个钱。ok这样又过了一段时间。
时间飞逝,岁月如梭。随着各大手机厂商的产品迭代,尼玛iphone都出到了6了。老板收集起来更加疯狂了,要把所有品牌的所有型号都买回来研究。这下又忙坏了秘书,因为秘书要搞清楚哪些个品牌都产到几代了,这当然也不是什么太大的难事,百度一下嘛,ok,在了解了各个品牌的系类产品后,再吩咐其他同事分别去买各个系列产品。当然如果产品品类太多,再增加个同事嘛。多付几个人力费而已。
最后土豪老板就这样将所有智能手机体验了个遍,都觉得不行,没有抓住消费者发烧心里,于是打算自己干一款产品,于是安静的创建了一家公司,势必要打造一款全球级别的重量级智能手机...美好的事情即将发生....那么问题来了,使用设计模式哪家强?
1.简单工厂模式(simple factory)
OK,小学语文老师教会了我们在分析语文课文时,按照自然段来划分中心思想。在第一段自然中程序员老板成分利用了自己所学的专长,将实际买手机问题,变成了面向对象问题(面向秘书哇!好幸福)。秘书具有按照老板要求买手机的功能。这个秘书就是工厂了(神马秘书是工厂?)抽象为工厂啦!专门做一间买各种品牌手机的事。而对于手机而言,需不需要抽象?各大手机厂商,也不太可能造芯片,屏幕等配件,所以也是个具有技术含量的零配件组装厂,所以可以具体抽象出行为(具有发短信,打电话,上网等功能的设备),各个实际手机厂商按照各自设计来设计。于是java代码如下:
//抽象类实现
abstract class phone
{ //抽象类至少一个抽象方法 这样才是抽象类
abstract void phoneInf();
}
//具体产品
class iphone extends phone
{
public void phoneInf()
{
System.out.println("Buy iphone");
}
}
class XiaoMi extends phone
{
public void phoneInf()
{
System.out.println("Buy XiaoMi");
}
}
//工厂
class Secretary
{
public static phone BuyPhone(String brand)
{
if(brand.equals("iphone") )
return new iphone();
else
{
if( brand.equals("XiaoMi") )
return new XiaoMi();
else
return null;
}
}
}
class Main
{
public static void main(String[] args)
{ //老板只需要告诉秘书买什么牌子的手机即可
phone p1 = Secretary.BuyPhone("XiaoMi");
p1.phoneInf();
phone p2 = Secretary.BuyPhone("iphone");
p2.phoneInf();
}
}
/************************************************************************/ /* C++实现 简单工厂模式 */ /************************************************************************/ #include#include using namespace std; class Phone { public : virtual void phoneInf() =0; //纯虚函数 }; class iPhone : public Phone { public: void phoneInf() { cout<<"Buy iPhone"< phoneInf(); Phone* p2 = Secretary::BuyPhone("XiaoMi"); p2->phoneInf(); return 0; }
从上可见简单工厂模式组成:
a.工厂类(这里是秘书),核心部分。由一个具体的类实现。
b.抽象产品。 (这里是phone),java中由一个接口或者抽象类实现。C++中可以由抽象类(含有纯虚函数的类)实现。
C.具体产品。这里指的是各个手机厂商产生的产品,比如iphone,xiaomi等。java中继承或者实现 抽象类和接口,完成实际产品实例的创建。C++中子类实例化对象。
这样做,老板(实际客户)只提出请求,执行全部将由秘书(工厂类)来做。其中工厂类必须具有逻辑判断等一些功能,比如秘书要能分辨各种手机品牌的功能。这样子,数据量小时候,完全可以这么做。一旦老板需要有些新手机,但是数据量较小时候,秘书就需要在买一些品牌了(对于工厂类而言,就是需要在修改类了)。
2.工厂方法模式(factory method)
第二自然段告诉我们,当秘书实在忙不过来了,频繁的修改工厂类,相当于导致秘书工作量巨大,必须有人来帮忙才行。这下秘书只管负责安排任务,具体的手机叫手下买了,再给秘书即可。这时候,需要增加一个抽象工厂类,用于只分发任务功能,具体的工作由实际工厂来做。代码如下:
//java 工厂方法模式
//抽象产品
abstract class phone
{
public abstract void phoneInf();
}
//具体产品
class iphone extends phone
{
public void phoneInf()
{
System.out.println("Buy iphone");
}
}
class XiaoMi extends phone
{
public void phoneInf()
{