三、抽象工厂模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

java版:

package com.shuang.abstractfactory;

public interface AbstractFactory {
	public Sender produce();
}
package com.shuang.abstractfactory;

public class MailFactory implements AbstractFactory{

	@Override
	public Sender produce() {
		return new MailSender();
	}
	
}
package com.shuang.abstractfactory;

public class MailSender implements Sender {

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

}
package com.shuang.abstractfactory;

public class SmsFactory implements AbstractFactory{

	@Override
	public Sender produce() {
		return new SmsSender();
	}
	public static void main(String[] args) {
		AbstractFactory f=new MailFactory();
		Sender produce = f.produce();
		produce.send();
	}
}
package com.shuang.abstractfactory;

public class SmsSender implements Sender {

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

}

c++版:

#include<iostream>
using namespace std;
class Fruit
{
public:
	virtual void SayName()=0;
};
class AbstractFactory{
public:
	virtual Fruit* CreateBanana()=0;
	virtual Fruit* CreateApple()=0;
};

class NorthBanana:public Fruit{
public:
	virtual void SayName()
	{
		cout<<"我是北方香蕉"<<endl;
	}
};
class NorthApple:public Fruit{
public:
	virtual void SayName()
	{
		cout<<"我是北方苹果"<<endl;
	}
};
class SouthBanana:public Fruit{
public:
	virtual void SayName()
	{
		cout<<"我是南方香蕉"<<endl;
	}
};
class SouthApple:public Fruit{
public:
	virtual void SayName()
	{
		cout<<"我是南方苹果"<<endl;
	}
};
class NorthFactory:public AbstractFactory
{
	virtual Fruit* CreateBanana()
	{
		return new NorthBanana;
	}
	virtual Fruit* CreateApple()
	{
		return new NorthApple;
	}
};
class SouthFactory:public AbstractFactory
{
	virtual Fruit* CreateBanana()
	{
		return new SouthBanana;
	}
	virtual Fruit* CreateApple()
	{
		return new SouthApple;
	}
};
void main()
{
	Fruit * fruit=NULL;
	AbstractFactory *af=NULL;

	af=new SouthFactory;
	fruit=af->CreateApple();
	fruit->SayName();
	delete fruit;
	fruit=af->CreateBanana();
	fruit->SayName();
	delete fruit;

	delete af;

	system("pause");
}

猜你喜欢

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