可复用面向对象软件基础——设计模式(三)之抽象工厂模式

一、工厂方法模式缺陷

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须修改工厂类,这违背了设计模式六大原则第一条闭包原则

所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

这里写图片描述

二、抽象工厂模式实现

/**
 * 1、邮寄接口,有一个抽象邮寄方法待实现
 * @author barnett
 *
 */
public interface Sender {

    public void send();
}
/**
 * 2、实现类,邮件邮寄类实现邮寄接口,实现其邮寄的方法
 * @author barnett
 *
 */
public class MailSender implements Sender {

    @Override
    public void send() {
        System.out.println("I am MailSender!");
    }
}
/**
 * 短信邮寄类实现邮寄接口,实现其邮寄方法
 * @author barnett
 *
 */
public class SmsSender implements Sender {

    @Override
    public void send() {
        System.out.println("I am SmsSender!");
    }
}
/**
 * 3、提供器接口,返回邮寄对象,其生产方法待实现
 * 工厂依靠实现该接口,生产产品(Sender)
 * @author barnett
 *
 */
public interface Provider {

    public Sender produce();

}
/**
 * 4、工厂,邮件邮寄工厂,负责专门生产邮件邮寄实例
 * @author barnett
 *
 */
public class SendMailFactory implements Provider {

    @Override
    public Sender produce() {
        return new MailSender();
    }
}
/**
 * 短信邮寄工厂,专门生产短信邮寄实例
 * @author barnett
 *
 */
public class SendSmsFactory implements Provider {

    @Override
    public Sender produce() {
        return new SmsSender();
    }
}
/**
 * 5、测试类
 * @author barnett
 *
 */
public class Test {

    public static void main(String[] args) {
        // 实例一个邮件工厂(因其实现了提供器接口,可返回一个具有专门生产某种产品生产方法的实例)
        Provider provider = new SendMailFactory();
        // 通过该实例生产产品
        Sender sender = provider.produce();
        // 调用产品的方法
        sender.send();
        // 实例生产另一种产品的工厂
        SendSmsFactory factory = new SendSmsFactory();
        Sender sender2 = factory.produce();
        sender2.send();
    }
}

三、抽象工厂模式优势

若想生产新的产品,只需一个实现类,实现Sender接口,再创建一个专门用于生产该产品的工厂类,实现Provider接口,这样一来,无需改动原有代码,拓展性好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值