一、概念描述
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。
每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。
在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。
产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:
抽象工厂模式通常是用于创一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。
二、抽象工厂模式类图
抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品。
可以看到产品族包括ProductA和ProductB两种产品,每个具体工厂都能生产这两种产品,只是ConcreteFactory1生产的等级为1的族产品;ConcreteFactory2生产的是等级为2的族产品。
三、一个实例
抽象工厂AbstractFactory—— Sender类:
package com.test.abstractfactory;
public interface Sender {
public void sender();
}
抽象工厂实现类1——MailSender类:
package com.test.abstractfactory;
public class MailSender implements Sender{
@Override
public void sender() {
System.out.println("this is mail sender!");
}
}
抽象工厂实现类2——SmsSender类:
package com.test.abstractfactory;
public class SmsSender implements Sender{
@Override
public void sender() {
System.out.println("this is sms sender!");
}
}
再提供一个实现Sender 的接口:
package com.test.abstractfactory;
public interface Provider {
public Sender produce();
}
具体工厂ConcreteFactory1——SendMailFactory类:
package com.test.abstractfactory;
public class SendMailFactory implements Provider{
@Override
public Sender produce() {
return new MailSender();
}
}
具体工厂ConcreteFactory2——SendSmsFactory类:
package com.test.abstractfactory;
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
测试主类:
package com.test.abstractfactory;
public class Test {
public static void main(String[] args) {
Provider mailProvider = new SendMailFactory();
Sender mailSender = new MailSender();
mailSender.sender();
Provider smsProvider = new SendSmsFactory();
Sender smsSender = new SmsSender();
smsSender.sender();
}
}
运行结果:
this is mail sender!
this is sms sender!
抽象工厂模式的好处就是,如果你现在想增加一个功能:发语音信息,只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需改动现成的代码。
这样做,拓展性较好!
代码如下:
抽象工厂实现类3——MailSender类:
package com.test.abstractfactory;
public class TTSSender implements Sender{
@Override
public void sender() {
System.out.println("this is tts sender!");
}
}
具体工厂ConcreteFactory3——SendTtsFactory类:
package com.test.abstractfactory;
public class SendTtsFactory implements Provider{
@Override
public Sender produce() {
return new TTSSender();
}
}
测试主类:
package com.test.abstractfactory;
public class Test {
public static void main(String[] args) {
Provider mailProvider = new SendMailFactory();
Sender mailSender = new MailSender();
mailSender.sender();
Provider smsProvider = new SendSmsFactory();
Sender smsSender = new SmsSender();
smsSender.sender();
Provider ttsProvider = new sendTtsFactory();
Sender ttsSender = new TTSSender();
ttsSender.sender();
}
}
执行结果:
this is mail sender!
this is sms sender!
this is tts sender!
参考:
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
http://blog.csdn.net/liruikqn/article/details/12888511
http://www.cnblogs.com/devinzhang/archive/2011/12/19/2293160.html
http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html