Java设计模式之抽象工厂模式

来源:互联网 发布:supreme淘宝正品店铺 编辑:程序博客网 时间:2024/04/29 21:24

一、概念描述

抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。

每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。
在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。

产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如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

1 0
原创粉丝点击