千家信息网

Java简单工厂,工厂方法,抽象工厂模式怎么实现

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"Java简单工厂,工厂方法,抽象工厂模式怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java简单工厂,工厂方法,抽象工厂
千家信息网最后更新 2026年11月03日Java简单工厂,工厂方法,抽象工厂模式怎么实现

这篇文章主要讲解了"Java简单工厂,工厂方法,抽象工厂模式怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java简单工厂,工厂方法,抽象工厂模式怎么实现"吧!

    1、简单工厂模式

    1.定义

    简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例。
    属于创建型模式,但它不属于GOF23种设计模式。

    2.代码案例

    假设以罐头产品的制造为案例

    第一步:定义罐头的顶层接口类ICanned

    /** * @Package: com.hzg.study.design.pattern.factory.simplefactory * @Description: 罐头顶层接口 * @Author: HuangZhiGao * @CreateDate: 2022-02-17 17:52 */public interface ICanned {    /**     * 展示罐头名称     * 

    * * @return void * @author HuangZhiGao * @date 2022/2/17/017 17:54 */ void showCannedName();}

    第二步:分别编写两个具体的实现类FruitCanned和BeefCanned

    /** * @Package: com.hzg.study.design.pattern.factory.simplefactory * @Description: 水果罐头 * @Author: HuangZhiGao * @CreateDate: 2022-02-17 17:56 */public class FruitCanned implements ICanned {    @Override    public void showCannedName() {        System.out.println("名称:水果罐头");    }}
    /** * @Package: com.hzg.study.design.pattern.factory.simplefactory * @Description: 牛肉罐头 * @Author: HuangZhiGao * @CreateDate: 2022-02-17 17:57 */public class BeefCanned implements ICanned {    @Override    public void showCannedName() {        System.out.println("名称:牛肉罐头");    }}

    第三步:编写工厂类

    import com.hzg.study.design.pattern.factory.common.ICanned;/** * @Package: com.hzg.study.design.pattern.factory.simplefactory * @Description: 罐头工厂类 * @Author: HuangZhiGao * @CreateDate: 2022-02-17 18:16 */public class CannedFactory {    /**     * 创建罐头的方法     * 

    * * @param clazz * @return com.hzg.study.design.pattern.factory.common.ICanned * @author HuangZhiGao * @date 2022/2/17/017 18:18 */ public ICanned createCanned(Class clazz) { if (null != clazz) { try { return clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } return null; }}

    第四步:main方法测试、查看类图

    import com.hzg.study.design.pattern.factory.common.BeefCanned;import com.hzg.study.design.pattern.factory.common.FruitCanned;import com.hzg.study.design.pattern.factory.common.ICanned;/** * @Package: com.hzg.study.design.pattern.factory.simplefactory * @Description: 测试类 * @Author: HuangZhiGao * @CreateDate: 2022-02-17 18:22 */public class SimpleFactoryTest {    public static void main(String[] args) {        CannedFactory cannedFactory = new CannedFactory();        ICanned fruitCanned = cannedFactory.createCanned(FruitCanned.class);        fruitCanned.showCannedName();        System.out.println("----------------------------------------");        ICanned beefCanned = cannedFactory.createCanned(BeefCanned.class);        beefCanned.showCannedName();    }}

    运行结果:

    名称:水果罐头
    ----------------------------------------
    名称:牛肉罐头

    简单工厂模式类图:

    3.适用场景

    工厂类负责创建的对象较少,不需要关心创建对象的逻辑

    4.优缺点

    优点:

    简化了客户端创建对象的过程

    缺点:

    1.工厂类职责相对较重,在一定程度上可能违背开闭原则(增加新的产品可能需要修改工厂类逻辑)
    2.不易于扩展过于复杂的产品结构

    2、工厂方法模式

    1.定义

    工厂方法模式(Factory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
    属于创建型设计模式。

    2.代码案例

    需要使用到简单工厂模式的ICanned、FruitCanned、BeefCanned

    第一步:定义罐头工厂顶层接口类ICannedFactory

    import com.hzg.study.design.pattern.factory.common.ICanned;/** * @Package: com.hzg.study.design.pattern.factory.factorymethod * @Description: 罐头工厂顶层接口 * @Author: HuangZhiGao * @CreateDate: 2022-02-18 10:03 */public interface ICannedFactory {    /**     * 创建罐头方法     * 

    * * @return void * @author HuangZhiGao * @date 2022/2/18/018 10:04 */ ICanned doCreateCanned();}

    第二步:分别编写两个具体的工厂实现类FruitCannedFactory和BeefCannedFactory

    import com.hzg.study.design.pattern.factory.common.FruitCanned;import com.hzg.study.design.pattern.factory.common.ICanned;/** * @Package: com.hzg.study.design.pattern.factory.factorymethod * @Description: 水果罐头工厂类 * @Author: HuangZhiGao * @CreateDate: 2022-02-18 10:05 */public class FruitCannedFactory implements ICannedFactory {    @Override    public ICanned doCreateCanned() {        return new FruitCanned();    }}
    import com.hzg.study.design.pattern.factory.common.BeefCanned;import com.hzg.study.design.pattern.factory.common.ICanned;/** * @Package: com.hzg.study.design.pattern.factory.factorymethod * @Description: 牛肉罐头工厂类 * @Author: HuangZhiGao * @CreateDate: 2022-02-18 10:08 */public class BeefCannedFactory implements ICannedFactory {    @Override    public ICanned doCreateCanned() {        return new BeefCanned();    }}

    第三步:main方法测试、查看类图

    import com.hzg.study.design.pattern.factory.common.BeefCanned;import com.hzg.study.design.pattern.factory.common.FruitCanned;import com.hzg.study.design.pattern.factory.common.ICanned;/** * @Package: com.hzg.study.design.pattern.factory.simplefactory * @Description: 测试类 * @Author: HuangZhiGao * @CreateDate: 2022-02-17 18:22 */public class SimpleFactoryTest {    public static void main(String[] args) {        CannedFactory cannedFactory = new CannedFactory();        ICanned fruitCanned = cannedFactory.createCanned(FruitCanned.class);        fruitCanned.showCannedName();        System.out.println("----------------------------------------");        ICanned beefCanned = cannedFactory.createCanned(BeefCanned.class);        beefCanned.showCannedName();    }}

    运行结果:

    名称:水果罐头
    ----------------------------------------
    名称:牛肉罐头

    工厂方法模式类图:

    3.适用场景

    创建对象需要大量重复的代码。
    客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
    一个类通过其子类来指定创建哪个对象。

    4.优缺点

    优点:

    1.用户只需关心所需产品对应的工厂,无须关心创建细节。
    2.加入新产品符合开闭原则,提高了系统的可扩展性。

    缺点:

    1.类的个数容易过多,增加了代码结构的复杂度。
    2.增加了系统的抽象性和理解难度。

    3、抽象工厂模式

    1.定义

    抽象工厂模式(Abstract Factory Pattern)是指提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类。
    属于创建型设计模式。

    抽象工厂模式有产品族和产品等级的概念,可以通俗的理解为

    产品族相当于不同品牌的产品合集,产品等级相当于不同品牌的同一种产品

    例如:水果罐头的材料信息、标签信息组成了一个产品族,牛肉罐头的材料信息、标签信息组成了一个产品族

    水果罐头的材料信息、牛肉罐头的材料信息组成一个产品等级,水果罐头的标签信息、牛肉罐头的标签信息组成一个产品等级

    2.代码案例

    假设制造一个罐头包含两个部分(材料信息+标签信息)

    第一步:分别定义罐头材料信息接口IMaterialInfo和罐头标签信息接口ITagInfo

    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: 罐头材料信息接口 * @Author: HuangZhiGao * @CreateDate: 2022-02-18 10:51 */public interface IMaterialInfo {    /**     * 打印材料信息     * 

    * * @return void * @author HuangZhiGao * @date 2022/2/18/018 10:57 */ void printMaterialInfo();}

    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: 罐头标签信息接口 * @Author: HuangZhiGao * @CreateDate: 2022-02-18 10:48 */public interface ITagInfo {    /**     * 打印标签信息     * 

    * * @return void * @author HuangZhiGao * @date 2022/2/18/018 10:57 */ void printTagInfo();}

    第二步:定义罐头的顶层工厂接口类ICannedFactory

    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: 顶层工厂接口:一个罐头包含两个部分(材料信息+标签信息) * @Author: HuangZhiGao * @CreateDate: 2022-02-18 10:47 */public interface ICannedFactory {    IMaterialInfo createMaterialInfo();    ITagInfo createTagInfo();}

    第三步:分别编写具体实现类FruitMaterialInfo、FruitTagInfo和BeefMaterialInfo、BeefTagInfo

    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:05 */public class FruitMaterialInfo implements IMaterialInfo {    @Override    public void printMaterialInfo() {        System.out.println("材料:水果");    }}
    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:05 */public class FruitTagInfo implements ITagInfo {    @Override    public void printTagInfo() {        System.out.println("标签:2022升级版水果罐头");    }}
    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:05 */public class BeefMaterialInfo implements IMaterialInfo {    @Override    public void printMaterialInfo() {        System.out.println("材料:牛肉");    }}
    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:06 */public class BeefTagInfo implements ITagInfo {    @Override    public void printTagInfo() {        System.out.println("标签:2022升级版牛肉罐头");    }}/** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:06 */public class BeefTagInfo implements ITagInfo {    @Override    public void printTagInfo() {        System.out.println("标签:2022升级版牛肉罐头");    }}

    第四步:分别编写工厂具体实现类FruitCannedFactory、BeefCannedFactory

    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:04 */public class FruitCannedFactory implements ICannedFactory {    @Override    public IMaterialInfo createMaterialInfo() {        return new FruitMaterialInfo();    }    @Override    public ITagInfo createTagInfo() {        return new FruitTagInfo();    }}
    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:04 */public class BeefCannedFactory implements ICannedFactory {    @Override    public IMaterialInfo createMaterialInfo() {        return new BeefMaterialInfo();    }    @Override    public ITagInfo createTagInfo() {        return new BeefTagInfo();    }}

    第五步:main方法测试、查看类图

    /** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:12 */public class AbstractFactoryTest {    public static void main(String[] args) {        ICannedFactory beefCannedFactory = new BeefCannedFactory();        beefCannedFactory.createMaterialInfo().printMaterialInfo();        beefCannedFactory.createTagInfo().printTagInfo();        System.out.println("----------------------------------------");        ICannedFactory fruitCannedFactory = new FruitCannedFactory();        fruitCannedFactory.createMaterialInfo().printMaterialInfo();        fruitCannedFactory.createTagInfo().printTagInfo();    }}

    运行结果:

    材料:牛肉
    标签:2022升级版牛肉罐头
    ----------------------------------------
    材料:水果
    标签:2022升级版水果罐头

    抽象工厂模式类图:

    3.适用场景

    客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
    强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。
    提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

    4.优缺点

    优点:

    1.具体产品在应用层代码隔离,无须关心创建细节。
    2.将一个系列的产品族统一到一起创建。

    缺点:

    1.规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
    2.增加了系统的抽象性和理解难度。

    感谢各位的阅读,以上就是"Java简单工厂,工厂方法,抽象工厂模式怎么实现"的内容了,经过本文的学习后,相信大家对Java简单工厂,工厂方法,抽象工厂模式怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

    工厂 罐头 模式 信息 产品 接口 标签 方法 材料 牛肉 水果 对象 水果罐头 代码 名称 品族 顶层 升级版 实例 升级 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司 亿人帮互联网科技有限公司 互联网科技公司经营范围 A股互联网金融科技公司 科技互联网政务服务 互联网科技会 盈实互联网科技 腾讯科技 互联网女皇 无锡溥仪互联网科技有限公司 海南购全球互联网科技 玖二柒互联网科技公司待遇 天速互联网络科技有限公司 互联网科技教育视频 昭通互联网科技选哪家 荆州市昕露互联网络科技有限公司 移动互联网科技公司 南通创西澳互联网科技有限公司 承德科技产业互联网平台 恒生互联网科技趋势 互联网高科技绘画 顺玮阁互联网科技 互联网养老 桔豆科技 海南购全球互联网科技 江阴互联网智能科技产品进口 互联网科技和信息 深圳育鹏互联网科技有限公司招聘 国大互联网教育科技有限公司工作 互联网科技创新的路径 上海乐五互联网科技有限公司 每日互联网科技新闻
    0