抽象工厂学习笔记

代码demo

在这里插入图片描述

抽象工厂测试类
package com.zhh.designpattern.abstractfactory;

// 简单工厂模式
// 优点:实现了对产品的创建过程的封装,使用户与产品创建过程隔离,如果创建过程相似,则可减少重复代码
// 缺点:但是对于新的品牌产品的创建,简单工厂模式并不能符合java七大设计原则中的开闭原则,必须要修改原来的工厂创建逻辑,
    // 即简单工厂的设计形式扩展很难

// 工厂方法模式
// 优点:为了解决简单工厂的扩展难问题,工厂方法模式定义一个顶层的工厂接口,规定了产品的创建规范,对于具体产品的创建,
    // 都由具体的子类工厂来实现,对于产品的创建来说,创建过程推迟到了子类的实现中。
    // 具体的说就是,新的品牌的产品创建,不需要修改已有逻辑,只需新增具体工厂和具体实体即可,因而具有很强的扩展性
// 缺点:对于新增产品的情况,需要同时新增实现顶层的工厂接口和具体产品的类,因此在实际项目开发中,一个产品的新增可能导致
    // 项目的结构变得愈加复杂

// 抽象工厂模式:
// 简单工厂和工厂方法模式都解决了一个品牌产品的创建,并且创建过程对客户端不可知,如创建冰箱的例子
    // 然而无论是创建冰箱还是创建空调的例子,都是涉及到创建同一类产品,
    // 不同的只是产品的品牌,如冰箱的创建有海尔的,美的的,海信的等等
// 如果客户端除了有创建冰箱的需求,同时还有创建空调和洗衣机、热水器等等不同类别的产品,简单工厂和工厂方法还能实现么?
public class AbstractFactoryTest {

    public static void main(String[] args) {

        IFurnitureFactory haierFurnitureFactory = new HaierFurnitureFactory();
        IAirCondition haierAirCondition = haierFurnitureFactory.createAirCondition();
        haierAirCondition.working();
        IFreezer haierFreezer = haierFurnitureFactory.createFreezer();
        haierFreezer.working();

        IFurnitureFactory meidiFurnitureFactory = new MeidiFurnitureFactory();
        IAirCondition meidiAirCondition = meidiFurnitureFactory.createAirCondition();
        meidiAirCondition.working();
        IFreezer meidiFreezer = meidiFurnitureFactory.createFreezer();
        meidiFreezer.working();

        // 这里涉及到产品族的概念,在简单工厂和工厂方法模式中无论是生产冰箱还是生产空调,在一种模式中都只是实现了创建同一种产品
        // 如创建冰箱这个产品,前面所做的扩展,都是基于冰箱,向不同的品牌做扩展,如新增海尔的冰箱,新增美的的冰箱
        // 而在抽象工厂模式中,顶层的工厂制定了可以生产多个不同产品的规范,所有实现这个工厂接口的子工厂都要求具备生产这些
        // 多个不同产品的能力,因此对一个工厂来说,生产的是一个产品族,即一系列产品
        // 同样的,一个产品族,可以向不同的品牌做扩展,只需要新增实现接口工厂的子工厂即可
//        IFurnitureFactory haixinFurnitureFactory = new HaixinFurnitureFactory();
        // 由于此时还没有海信的工厂类,为避免代码报错,所以将其注释
        // 但是,可以看到,此时没有新增的工厂类,但后面的代码却并没有报错,那是因为抽象工厂的设计制定了不同产品创建的统一规范
        // 相比简单工厂和工厂方法,抽象工厂可以说是站在了更加抽象的层面
        IFurnitureFactory haixinFurnitureFactory = null;
        IAirCondition haixinAirCondition = haixinFurnitureFactory.createAirCondition();
        haixinAirCondition.working();
        IFreezer haixinFreezer = haixinFurnitureFactory.createFreezer();
        haixinFreezer.working();
    }
}
测试效果

在这里插入图片描述

抽象工厂(家用电器接口)
package com.zhh.designpattern.abstractfactory;

// 实现了创建产品族的概念,抽象工厂定义统一的规范,工厂接口中定义的不同产品的创建均返回的是抽象的产品,易于扩展,添加新的产品族
// 但是,抽象工厂和工厂方法有一个共同的缺点,抽象工厂对于新的产品族的加入,往往会大幅增加项目结构的复杂度
// 此外,有一个致命的问题存在,一个产品族中新增产品时,需要修改顶层工厂,添加新产品的创建标准,而这一动作直接影响到所有
// 实现了工厂接口的子工厂,要求所有子工厂都添加新的规范的实现,严重违背了开放封闭原则
// 因此,是否使用抽象工厂要看实际的需求场景而定
public interface IFurnitureFactory {

    IAirCondition createAirCondition();

    IFreezer createFreezer();

}
抽象产品(空调)
package com.zhh.designpattern.abstractfactory;

public interface IAirCondition{

    void working();
}
抽象产品(冰箱)
package com.zhh.designpattern.abstractfactory;

public interface IFreezer {

    void working();
}
具体工厂(海尔电器工厂)
package com.zhh.designpattern.abstractfactory;


public class HaierFurnitureFactory implements IFurnitureFactory {

    @Override
    public IAirCondition createAirCondition() {
        return new HaierAirCondition();
    }

    @Override
    public IFreezer createFreezer() {
        return new HaierFreezer();
    }
}
具体工厂(美的电器工厂)
package com.zhh.designpattern.abstractfactory;

public class MeidiFurnitureFactory implements IFurnitureFactory {

    @Override
    public IAirCondition createAirCondition() {
        return new MeidiAirCondition();
    }

    @Override
    public IFreezer createFreezer() {
        return new MeidiFreezer();
    }
}
具体产品(海尔空调)
package com.zhh.designpattern.abstractfactory;

public class HaierAirCondition implements IAirCondition {

    HaierAirCondition(){
        System.out.println("海尔空调生产完成.");
    }

    @Override
    public void working() {
        System.out.println("海尔空调开始工作..\n----------------------------\n");
    }
}
具体产品(海尔冰箱)
package com.zhh.designpattern.abstractfactory;

public class HaierFreezer implements IFreezer {

    HaierFreezer(){
        System.out.println("海尔冰箱生产完成.");
    }

    @Override
    public void working() {
        System.out.println("海尔冰箱开始工作..\n--------------------\n");
    }
}
具体产品(美的空调)
package com.zhh.designpattern.abstractfactory;


public class MeidiAirCondition implements IAirCondition {

    MeidiAirCondition(){
        System.out.println("美的空调生产完成.");
    }

    @Override
    public void working() {
        System.out.println("美的空调开始工作..\n--------------------\n");
    }
}
具体产品(美的冰箱)
package com.zhh.designpattern.abstractfactory;

public class MeidiFreezer implements IFreezer {

    MeidiFreezer(){
        System.out.println("美的冰箱生产完成.");
    }

    @Override
    public void working() {
        System.out.println("美的冰箱开始工作..\n---------------------------\n");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值