小工具知识网

当前位置: 首页 > 行业知识 > 设计模式(十):抽象工厂模式(创建型模式)

行业知识

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

2026-11-12 13:59:26 来源:互联网转载

��       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);        //以下物流运输业务。。。。    }}

上一篇:大陆服务器专区怎么进入?

下一篇:轻松下载withAPP攻略,一站式教程解析!