/************************************************************************ C++实现 工厂方法模式 ************************************************************************/ #include#include using namespace std; class Phone { public : virtual void phoneInf() =0; //纯虚函数 }; class iPhone : public Phone { public: void phoneInf() { cout<<"Buy iPhone"< phoneInf(); //秘书叫person2 去买xiaomi PersonB_XiaoMi person2 ; Phone* phone2 = person2.BuyPhone(); phone2->phoneInf(); return 0; }
从上可见工厂方法模式组成:
a. 抽象产品。 (这里是phone),java中由一个接口或者抽象类实现。C++中可以由抽象类(含有纯虚函数的类)实现。
b.具体产品。这里指的是各个手机厂商产生的产品,比如iphone,xiaomi等。java中继承或者实现 抽象类和接口,完成实际产品实例的创建。C++中子类实例化对象。
c. 抽象工厂类(这里是秘书),相比于简单工厂模式,增加的,将秘书从实际劳力中解放出来,只负责安排任务,由一个抽象类实现。
d.实际工厂。指的是 实际买手机的人。实际类实例化。
这样将导致,秘书轻松了许多,具体买手机这件事,也比较好做,只要人手够多,一旦要新买个手机,只需要秘书在派个人即可,这样对于秘书而言,依然轻松,可扩展。但是唯一的坏处就是需要花钱雇佣人手,多应于实际代码张就是要多很多实际的类。whatever,事情可以达到要求嘛。
3.抽象工厂模式
第三自然段告诉我们,手机厂商都出系列手机了,前两模式都不适用了,总不可能秘书吩咐A去买iphone1,又叫B去买iphone2吧..当然也可以,但是没必要啊。买iPhone1的肯定可以去买iphone2嘛。所以秘书需要从新规划下任务清单,好重新安排任务了。
//java 抽象工厂模式
//抽象产品类
abstract class phone
{
public abstract void phoneInf();
}
//具体产品
class iphone1 extends phone
{
public void phoneInf()
{
System.out.println("Buy iphone1");
}
}
class iphone1s extends phone
{
public void phoneInf()
{
System.out.println("Buy iphone1s");
}
}
class XiaoMi1 extends phone
{
public void phoneInf()
{
System.out.println("Buy XiaoMi1");
}
}
class XiaoMi1s extends phone
{
public void phoneInf()
{
System.out.println("Buy XiaoMi1s");
}
}
//抽象工厂类
abstract class Secretary
{
public abstract phone BuyPhone_1();//买一代手机
public abstract phone BuyPhone_1s(); //买一代升级版
//public abstract phone BuyPhone_2(); //买二代手机
//继续扩展...
}
//实际工厂类
class PersonA_iphone extends Secretary
{
public phone BuyPhone_1()//买iphone一代手机
{
return new iphone1();
}
public phone BuyPhone_1s()//买iphone1s版
{
return new iphone1s();
}
}
class PersonB_XiaoMi extends Secretary
{
public phone BuyPhone_1()
{
return new XiaoMi1();
}
public phone BuyPhone_1s()
{
return new XiaoMi1s();
}
}
class Main
{
public static void main(String[] args)
{
//秘书分配person1去买iphone1,1s产品
PersonA_iphone person1 = new PersonA_iphone() ;
phone p1 = person1.BuyPhone_1();//personA 买的iphone1
phone p2 = person1.BuyPhone_1s();//personA 买的iphone1s
p1.phoneInf();
p2.phoneInf();
//秘书分配person2去买XiaoMi1,1s产品
PersonB_XiaoMi person2 = new PersonB_XiaoMi();
phone p3 = person2.BuyPhone_1();
p3.phoneInf();
phone p4 = person2.BuyPhone_1s();
p4.phoneInf();
}
}
/*********************************************************************** C+