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

一、概念描述

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

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

产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值