二、工厂方法模式

工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式。

(1)普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

 

package com.shuang.factory;

public interface Sender {
	public void send();
}
package com.shuang.factory;

public class MailSender implements Sender {

	public void send() {
		System.out.println("mailSender");
	}

}
package com.shuang.factory;

public class SmsSender implements Sender {

	@Override
	public void send() {
		System.out.println("smsSender");
	}

}
package com.shuang.factory;

public class SendFactory {
	public Sender produce(String name){
		if(name.equals("sms")){
			return new SmsSender();
		}else if(name.equals("mail")){
			return new MailSender();
		}else{
			System.out.println("没有此对象");
			return null;
		}
	}
	public static void main(String[] args) {
		SendFactory factory=new SendFactory();
		Sender s=factory.produce("sms");
		s.send();
	}
}

c++版如下:

#include<iostream>
using namespace std;
class Fruit
{
public:
	virtual void getFruit()=0;
};
class Banana:public Fruit
{
public:
	virtual void getFruit()
	{
		cout<<"我是香蕉。。。。"<<endl;
	}
};
class Apple:public Fruit
{
public:
	virtual void getFruit()
	{
		cout<<"我是苹果"<<endl;
	}
};
class Factory
{
public:
	Fruit *create(char *p)
	{
		if(strcmp(p,"banana")==0)
		{
			return new Banana;
		}
		else if(strcmp(p,"apple")==0)
		{
			return new Apple;
		}
		else
		{
			printf("不支持\n");
			return NULL;
		}
	}
};
void main()
{
	Factory *f=new Factory;
	Fruit * fruit=NULL;

	fruit=f->create("banana");
	fruit->getFruit();
	delete fruit;

	fruit=f->create("apple");
	fruit->getFruit();
	delete fruit;

	delete f;
	system("pause");
}

(2)多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

将上面代码的SendFactory作如下修改即可

package com.shuang.manyfactory;

public class SendFactory {
	public Sender produceMail(){
		return new MailSender();
	}
	public Sender produceSms(){
		return new SmsSender();
	}
	public static void main(String[] args) {
		SendFactory factory=new SendFactory();
		Sender s=factory.produceSms();
		s.send();
	}
}

c++版如下:

#include<iostream>
using namespace std;
class Fruit
{
public:
	virtual void sayname()=0;
};
class Banana:public Fruit
{
public:
	void sayname()
	{
		cout<<"我是香蕉"<<endl;
	}
};
class Apple:public Fruit
{
public:
	void sayname()
	{
		cout<<"我是Apple"<<endl;
	}
};
class AbFactory
{
public:
	virtual Fruit *CreateProduct()=0;
};
class BananaFactory:public AbFactory
{
public:
	virtual Fruit *CreateProduct()
	{
		return new Banana;
	}
};
class AppleFactory:public AbFactory
{
public:
	virtual Fruit *CreateProduct()
	{
		return new Apple;
	}
};
void main()
{
	AbFactory *factory=NULL;
	Fruit *fruit=NULL;

	factory=new BananaFactory;
	fruit=factory->CreateProduct();
	fruit->sayname();
	delete fruit;

	factory=new AppleFactory;
	fruit=factory->CreateProduct();
	fruit->sayname();
	delete fruit;



	delete factory;
	system("pause");
}

(3)静态工厂方法模式

静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

package com.shuang.staticfactory;

public class SendFactory {
	public static Sender produceMail(){
		return new MailSender();
	}
	public static Sender produceSms(){
		return new SmsSender();
	}
	public static void main(String[] args) {
		Sender s=SendFactory.produceSms();
		s.send();
	}
}

猜你喜欢

转载自blog.csdn.net/shuangyueliao/article/details/81149367
今日推荐