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