设计模式二十三之工厂模式--抽象工厂模式

目录

 

1.什么是抽象工厂模式

2.优缺点

3.适用场景

4.工厂模式的角色

更多详细扩展代码:


1.什么是抽象工厂模式

是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。解决工厂方法模式无法处理多产品问题。

2.优缺点

优点:

  1. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  2. 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
  3. 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则

缺点:

    新增产品种类工厂都需要更新,系统更难理解。

3.适用场景

系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

4.工厂模式的角色

产品组1,参考简单工厂模式

新增产品组2:

抽象产品;

public interface School {

    /**
     * 输出学校名称
     */
    void outName();
}

具体产品:

public class QhSchool implements School {
    @Override
    public void outName() {
        System.out.println("清华");
    }
}
public class BdSchool implements School {
    @Override
    public void outName() {
        System.out.println("北大");
    }
}

抽象工厂: 可确认职业和学校

public abstract class AbstractFactory {

    /**
     * 获取职业信息
     *
     * @param type 职业 type
     * @return 职业
     */
    public abstract Profession getProfession(int type);

    /**
     * 获取学信息
     *
     * @param type 学校 type
     * @return 学校
     */
    public abstract School getSchool(int type);
}

具体工厂:

public class ProfessionFactory extends AbstractFactory {
    @Override
    public Profession getProfession(int type) {
        Profession profession = null;
        switch (type) {
            case 1:
                profession = new Tester();
                break;
            case 2:
                profession = new Developer();
                break;
        }

        return profession;
    }

    @Override
    public School getSchool(int type) {
        return null;
    }
}
public class SchoolFactory extends AbstractFactory {
    @Override
    public Profession getProfession(int type) {
        return null;
    }

    @Override
    public School getSchool(int type) {
        School school = null;
        switch (type) {
            case 1:
                school = new QhSchool();
                break;
            case 2:
                school = new BdSchool();
                break;
        }
        return school;
    }
}

抽象工厂测试

public class AbstractFactoryMain {
    public static void main(String[] args) {
        SchoolFactory schoolFactory = new SchoolFactory();
        schoolFactory.getSchool(1).outName();
        schoolFactory.getSchool(2).outName();

        ProfessionFactory professionFactory = new ProfessionFactory();
        professionFactory.getProfession(1).outDesc();
        professionFactory.getProfession(2).outDesc();
    }
}

更多详细扩展代码:

gitlhub项目地址:https://github.com/foralllove/my-utils

gitee地址:https://gitee.com/huanghe3/my-utils

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值