设计模式之(四)抽象工厂

抽象工厂

多态工厂利用具体工厂操作具体产品,那么如果需要更多的产品,就会需要更多的具体工厂类,加大了系统的开销。我们可以考虑一种把相关产品的类由同一个具体的工厂所生产,这就是抽象工厂的思想。
在这里插入图片描述
在这里插入图片描述
使用上一回的多态工厂模式,这将会是一个比较复杂的类图。
在这里插入图片描述
产品等级与产品族
在这里插入图片描述
(1)产品等级结构(横向):产品的继承结构,比如一个抽象产品是电视机,其子类可能是海尔电视机、海信电视机、TCL电视机,抽象产品和具体品牌构成了一个等级结构,电视机是父类,具体品牌的产品是子类。
(2)产品族(纵向):在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如海尔冰箱、海尔电视机。
在这里插入图片描述
在这里插入图片描述

抽象工厂概述

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类,又称为KIT模式,同样是一种创建型模式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抽象工厂不符合开闭原则,原因在于增加新的产品族将会不需要改变代码就可以实现开闭原则,但是如果新增一个产品等级结构将会是很大的麻烦,这也是抽象工厂模式最大的缺点。要求开发人员在设计之初就对产品等级结构全面考虑,不会在设计完之后的系统中添加新的产品等级结构,也不会删除原来的等级结构,否则在后续的维护工作带来很大麻烦。

sunny公司完美解决方案

在这里插入图片描述

代码做了省略,只用了两个产品等级结构

package com.learn.designmode.mode.factory.abstractFactory;

public interface BaseButton {
    public void display();
}

class SummerButton implements BaseButton {

    @Override
    public void display() {
        System.out.println("红色按钮");
    }
}

class SpringButton implements BaseButton{

    @Override
    public void display() {
        System.out.println("蓝色按钮");
    }
}



package com.learn.designmode.mode.factory.abstractFactory;

public interface BaseCombox {
    public void display();
}

/**
 * spring按钮
 */
class SpringCombox implements BaseCombox{

    @Override
    public void display() {
        System.out.println("蓝色单选");
    }
}

class SummerCombox implements BaseCombox{

    @Override
    public void display() {
        System.out.println("红色单选");
    }
}


package com.learn.designmode.mode.factory.abstractFactory;

public abstract class BaseFactory {
    public abstract BaseButton cerateButton();
    public abstract BaseCombox createdCombox();
}


package com.learn.designmode.mode.factory.abstractFactory;

public class SpringFactory extends BaseFactory{


    @Override
    public BaseButton cerateButton() {
        return new SpringButton();
    }

    @Override
    public BaseCombox createdCombox() {
        return new SpringCombox();
    }
}

package com.learn.designmode.mode.factory.abstractFactory;

public class SummerFactory extends BaseFactory{

    @Override
    public BaseButton cerateButton() {
        return new SummerButton();
    }

    @Override
    public BaseCombox createdCombox() {
        return new SummerCombox();
    }
}

在这里插入图片描述
在这里插入图片描述

抽象工厂的总结

优点

(1)抽象工厂隔离了具体类的生成,跟多态工厂一样,由子类实现对产品的实例化,改了具体工厂的行为,某种程度上改变了软件系统的行为。
(2)当一个产品族的多个对象设计成一起工作时,客户端始终调用的是同一个产品族中的对象。
(3)增加产品族不需要改已有的系统,只需要加代码,符合开闭原则。

缺点

(1)增加产品等级结构需要对抽象工厂进行修改,违背开闭原则。

使用场景

(1)一个系统不应当依赖于产品如何被实例创建,组合和表达,用户无需关心对象的创建过程,创建和使用解耦。
(2)系统中有多余一个的产品族,而每次只使用其中的某一产品族,通过配置文件等方式来动态改变产品族,方便增加新的产品族。
(3)属于同一个产品族的产品放在一起使用,同一产品族的产品可以没有任何关系的对象,但是要有一套共同的约束,比如系统控制按钮和复选框。
(4)设计完成后,产品等级结构不需要修改或者添加删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值