设计模式学习(1) --- 3类工厂模式(二)

2015-01-27 18:06:37 · 作者: · 浏览: 165
System.out.println("Buy XiaoMi"); } } //抽象工厂类 abstract class Secretary { public abstract phone BuyPhone(); } //实际工厂类 class PersonA_iphone extends Secretary { public phone BuyPhone() { return new iphone(); } } class PersonB_XiaoMi extends Secretary { public phone BuyPhone() { return new XiaoMi(); } } class Main { public static void main(String[] args) { //秘书分配person1去买iphone PersonA_iphone person1 = new PersonA_iphone() ; phone p1 = person1.BuyPhone(); p1.phoneInf(); //秘书分配person2去买XiaoMi PersonB_XiaoMi person2 = new PersonB_XiaoMi(); phone p2 = person2.BuyPhone(); 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(); //秘书叫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+