设计模式-抽象工厂(创建型)

创建型-抽象工厂

角色

  1. 抽象工厂: 声明创建一个族产品对象的方法,每个方法对应一中产品,抽象工厂可以是接口,也可以是抽象类;
  2. 具体工厂: 实现抽象工厂接口,复杂创建具体的一族产品;
  3. 抽象产品:定义一类产品的公共接口,描述一类产品的特定行为或者属性;
  4. 具体产品:实现抽象产品接口,定义具体产品的特定行为和属性;
    其中,一族的概念可根据业务情况进行分族。比如:形状,颜色可分为两个族,再比如,植物, 动物也可以分为两个族。族的概念根据区分维度不同可分为不同的族;

图解

实现案例

这个案例中按照年龄将人分为小孩,老年人,中年人三族,产品分为上衣、裤子、鞋子三个种类;其中实现了老年人和小孩两个族衣服的抽象工厂。

抽象产品类:

java 复制代码
/** 上衣抽象类*/
public abstract class Jacket {
    public abstract void wearJacket();
}

/** 鞋子抽象类*/
public abstract class Shoes {
    public abstract void wearShoes();
}

/** 裤子抽象类*/
public abstract class Trousers {
    public abstract void wearTrousers();
}

具体产品类:

java 复制代码
/** 小孩衣服的具体类*/

public class ChildishJacket extends Jacket {
    @Override
    public void wearJacket() {
        System.out.println("小孩的上衣");
    }
}
public class ChildishShoes extends Shoes {

    @Override
    public void wearShoes() {
        System.out.println("小孩的鞋子");
    }
}
public class ChildishTrousers extends Trousers {
    @Override
    public void wearTrousers() {
        System.out.println("小孩的裤子");
    }
}


/** 老年人衣服的具体类*/
public class OldJacket extends Jacket {
    @Override
    public void wearJacket() {
        System.out.println("老年人上衣");
    }
}
public class OldTrousers extends Trousers {
    @Override
    public void wearTrousers() {
        System.out.println("老年人的裤子");
    }
}
public class OldShoes extends Shoes {
    @Override
    public void wearShoes() {
        System.out.println("老年人的鞋子");
    }
}

抽象工厂类:

java 复制代码
/** 生产衣服的抽象工厂*/
public abstract class AbstractClothesFactory {
    public abstract Jacket createJacket();
    public abstract Shoes createShoes();
    public abstract Trousers createTrousers();
}

具体工厂类:

java 复制代码
/** 儿童衣服生产工厂*/
public class ChildishClothesFactory extends AbstractClothesFactory {
    private static ChildishClothesFactory INSTANCE = new ChildishClothesFactory();
    public static ChildishClothesFactory getInstance(){
        return INSTANCE;
    }
    @Override
    public Jacket createJacket() {
        return new ChildishJacket();
    }

    @Override
    public Shoes createShoes() {
        return new ChildishShoes();
    }

    @Override
    public Trousers createTrousers() {
        return new ChildishTrousers();
    }
}

/** 老年人衣服生产工厂*/
public class OldClothesFactory extends AbstractClothesFactory{
    private static OldClothesFactory INSTANCE = new OldClothesFactory();

    public static OldClothesFactory getInstance(){
        return INSTANCE;
    }

    @Override
    public Jacket createJacket() {
        return new OldJacket();
    }

    @Override
    public Shoes createShoes() {
        return new OldShoes();
    }

    @Override
    public Trousers createTrousers() {
        return new OldTrousers();
    }
}

使用:

java 复制代码
public class Main {
    public static void main(String[] args) {
        //生产儿童一族的衣服
        ChildishClothesFactory childishClothesFactory = ChildishClothesFactory.getInstance();
        Jacket childishJacket = childishClothesFactory.createJacket();
        Shoes childishShoes = childishClothesFactory.createShoes();
        Trousers childishTrousers = childishClothesFactory.createTrousers();
        //生产老年人一族的衣服
        OldClothesFactory oldClothesFactory = OldClothesFactory.getInstance();
        Jacket oldJacket = oldClothesFactory.createJacket();
        Shoes oldShoes = oldClothesFactory.createShoes();
        Trousers oldTrousers = oldClothesFactory.createTrousers();

        childishJacket.wearJacket();
        oldJacket.wearJacket();
    }
}

总结

  1. 抽象工厂是生产一族的产品,族的概念可根据不同的业务规则区分。
  2. 扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。
  3. 对于新增族来说,满足开闭原则,而对于新增产品来说,不满足开闭原则。
相关推荐
smallyoung11 分钟前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga2 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff3 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3273 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar4 小时前
Java封装、继承、多态
java·开发语言
ly76894 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠4 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
高晶4 小时前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
奇牙coding4 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!4 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp