Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对
象的接口,而无须指定它们的具体类。
之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。
简单工厂模式其实不符合开闭原则,即对修改关闭,扩展开放。简单工厂每次需要新增新的产品就需要修改工厂类。而工厂方法模式,每个工厂只负责创建单一的产品,相当于真实工厂里面的一条流水线,如果一个工厂自身能创建多个产品呢?那就需要抽象工厂了。
三种工厂模式的区别:
简单工厂模式:一个抽象产品类(或接口),可以派生出多个具体产品类。
只有一个静态工厂,负责创建多个具体产品类的实例。
工厂方法模式:一个抽象产品类(或接口),可以派生出多个具体产品类。
一个抽象工厂类(或接口),可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类(或接口),可以派生出多个具体产品类。
一个抽象工厂类(或接口),可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类(或接口),而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
“抽象工厂”就像真的工厂,“工厂方法”就像工厂中的一条生产线。
抽象工厂模式Demo:
先看类图:

工程结构:

上代码:
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:Fruit
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:水果接口
- * @Date:2024/3/8 10:25
- * @Author:figo
- */
- public interface Fruit {
- //采摘
- void pick();
- }
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:Apple
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:苹果产品
- * @Date:2024/3/8 10:32
- * @Author:figo
- */
- public class Apple implements Fruit{
-
- @Override
- public void pick() {
- System.out.println("采摘苹果");
- }
- }
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:Banana
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:香蕉产品
- * @Date:2024/3/8 10:35
- * @Author:figo
- */
- public class Banana implements Fruit{
-
- @Override
- public void pick() {
- System.out.println("采摘香蕉");
- }
- }
-
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:Bag
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:包装盒接口
- * @Date:2024/3/8 10:36
- * @Author:figo
- */
- public interface Bag {
- //打包
- void pack(Fruit fruit);
- }
-
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:AppleBag
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:苹果包装盒
- * @Date:2024/3/8 10:37
- * @Author:figo
- */
- public class AppleBag implements Bag{
- @Override
- public void pack(Fruit fruit) {
- System.out.println("苹果盒打包苹果");
- }
- }
-
-
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:BananaBag
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:香蕉包装盒
- * @Date:2024/3/8 10:37
- * @Author:figo
- */
- public class BananaBag implements Bag{
-
- @Override
- public void pack(Fruit fruit) {
- System.out.println("香蕉盒打包苹果");
-
- }
- }
-
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:AbstractFactory
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:抽象工厂,能生产多种产品,比工厂方法模式只能生产单一产品更强
- * @Date:2024/3/8 10:42
- * @Author:figo
- */
- public abstract class AbstractFactory {
- public abstract Fruit getFruit();
- public abstract Bag getBag();
- }
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:AppleFactory
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:苹果工厂能生产苹果和苹果包装盒
- * @Date:2024/3/8 10:46
- * @Author:figo
- */
- public class AppleFactory extends AbstractFactory{
- @Override
- public Fruit getFruit() {
- return new Apple();
- }
-
- @Override
- public Bag getBag() {
- return new AppleBag();
- }
- }
-
-
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:BananaFactory
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:香蕉工厂,能生产香蕉也能生产香蕉包装盒
- * @Date:2024/3/8 10:49
- * @Author:figo
- */
- public class BananaFactory extends AbstractFactory{
- @Override
- public Fruit getFruit() {
- return new Banana();
- }
-
- @Override
- public Bag getBag() {
- return new BananaBag();
- }
- }
-
-
- package com.figo.study2024.pattern.abstractfactory;
-
- /**
- * @ClassName:FruitGardenClient
- * @PackageName:com.figo.study2024.pattern.abstractfactory
- * @Description:水果园客户端,测试抽象工厂模式
- * @Date:2024/3/8 10:51
- * @Author:figo
- */
- public class FruitGardenClient {
- public static void main(String[] args) {
- fruitOrder();
- }
-
- /**
- * 水果订单
- */
- public static void fruitOrder()
- {
- //初始化工厂
- AbstractFactory factory = new AppleFactory();//spring使用注入方式,这里测试苹果工厂
- //苹果工厂能生产苹果
- Fruit fruit = factory.getFruit();
- fruit.pick();
- //苹果工厂也能生产包装盒
- Bag bag = factory.getBag();
- bag.pack(fruit);
- //以下物流运输业务。。。。
- }
- }
-