java设计模式---抽象工厂模式(Abstract Factory)

java设计模式—抽象工厂模式(Abstract Factory)

http://blog.csdn.net/uftjtt/article/details/79446242博文中介绍的工厂方法模式有一个弊端:一个具体工厂只能创建一类产品。
1. 工厂方法和抽象工厂模式的区别
工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
工厂方法创建 “一种” 产品,他的着重点在于”怎么创建”,也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。
抽象工厂需要创建一系列产品,着重点在于”创建哪些”产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。
2. 抽象工厂模式定义
也称为Kit模式,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象,最具一般性的。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
3. UML图
这里写图片描述
4. 抽象工厂的具体组成及使用
4.1 组成

组成(角色)关系作用
抽象产品族(AbstractProduct)抽象产品的父类描述抽象产品的公共接口
抽象产品(Product)具体产品的父类描述具体产品的公共接口
具体产品(Concrete Product)抽象产品的子类;工厂类创建的目标类描述生产的具体产品
抽象工厂(Creator)具体工厂的父类描述具体工厂的公共接口
具体工厂(Concrete Creator)抽象工厂的子类;被外界调用描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

4.3 使用步骤
(1)创建抽象工厂类,定义具体工厂的公共接口;
(2)创建抽象产品族类 ,定义抽象产品的公共接口;
(3)创建抽象产品类 (继承抽象产品族类),定义具体产品的公共接口;
(4)创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
(5)创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
(6)客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
5. 具体的代码实现

//创建抽象工厂类
public abstract class AbstractFactory {
    public abstract AbstractMailSender getMailSender();
    public abstract AbstractSmsSender getSmsSender();
}
//创建抽象的产品簇类
public abstract class AbstractSender {
    public abstract void display();
}
//创建抽象的邮件产品簇类
public abstract class AbstractMailSender extends AbstractSender {
    @Override
    public void display() {
        System.out.println("This is abstract MailSender");
    }
}
//创建抽象的短信产品簇类
public abstract class AbstractSmsSender extends AbstractSender {
    @Override
    public void display() {
        System.out.println("This is abstract Sms Sender");
    }
}
//创建具体的mail类
public class NormalMailSender extends AbstractMailSender {
    @Override
    public void display() {
        System.out.println("This is normal mail sender");
    }
}
public class DelayMailSender extends AbstractMailSender {
    @Override
    public void display() {
        System.out.println("This is delay Mail sender");
    }
}
//创建具体的sms类
public class NormalSmsSender extends AbstractSmsSender {
    @Override
    public void display() {
        System.out.println("This is normal Sms sender");
    }
}
public class DelaySmsSender extends AbstractSmsSender {
    @Override
    public void display() {
        System.out.println("This is delay Sms sender");
    }
}
//定义具体的产品工厂类
public class NormalFactory extends AbstractFactory {
    @Override
    public AbstractMailSender getMailSender() {
        return new NormalMailSender();
    }
    @Override
    public AbstractSmsSender getSmsSender() {
        return new NormalSmsSender();
    }
}
public class DelayFactory extends AbstractFactory {
    @Override
    public AbstractMailSender getMailSender() {
        return new DelayMailSender();
    }

    @Override
    public AbstractSmsSender getSmsSender() {
        return new DelaySmsSender();
    }
}

//抽象工厂模式测试类
public class AbstractFactoryTest {
    public static void main(String[] args) {
        // normal产品族
        AbstractFactory normalFactory = new NormalFactory();
        AbstractMailSender normalMailSender = normalFactory.getMailSender();
        normalMailSender.display();
        AbstractSmsSender normalSmsSender = normalFactory.getSmsSender();
        normalSmsSender.display();
        // delay产品族
        AbstractFactory delayFactory = new DelayFactory();
        delayFactory.getMailSender().display();
        delayFactory.getSmsSender().display();
    }
}

6. 抽象工厂优缺点
6.1 优点
(1)降低耦合
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
(2)更符合开-闭原则
新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可,简单工厂模式需要修改工厂类的判断逻辑
(3)符合单一职责原则
每个具体工厂类只负责创建对应的产品,简单工厂中的工厂类存在复杂的switch逻辑判断
(4)不使用静态工厂方法,可以形成基于继承的等级结构。
简单工厂模式的工厂类使用静态工厂方法
6.2 缺点
(1)抽象工厂模式很难支持新种类产品的变化。
这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值