Java设计模式之工厂模式案例详解

 更新时间:2022年02月15日 09:24:18   作者:温故知新之java  
工厂模式(Factory Pattern)是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。本文将通过案例详细讲解一下工厂模式,需要的可以参考一下

分类

1.简单工厂模式

2.工厂方法模式

3.抽象工厂模式

案例

需求

根据蛋糕的不同口味,分别创建苹果味和香蕉味的蛋糕实例

方案一:简单工厂模式

定义蛋糕父类

/**
 * 蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class Cake {
}

定义苹果味的蛋糕

/**
 * 苹果蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class AppleCake extends Cake{
    public AppleCake(){
        System.out.println("创建了苹果蛋糕实例");
    }
}

定义香蕉味的蛋糕

/**
 * 香蕉蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class BananaCake extends Cake{
    public BananaCake(){
        System.out.println("创建了香蕉蛋糕实例");
    }
}

定义蛋糕工厂类

/**
 * 蛋糕工厂
 * @author:liyajie
 * @createTime:2022/2/14 10:16
 * @version:1.0
 */
public class CakeFactory {

    public Cake createCake(String type){
        if("apple".equals(type)){
            return new AppleCake();
        }else if("banana".equals(type)){
            return new BananaCake();
        }else {
            return null;
        }
    }
}

定义测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/14 10:25
 * @version:1.0
 */
public class Test {
    public static void main(String[] args) {
        CakeFactory cakeFactory = new CakeFactory();
        cakeFactory.createCake("apple");
        cakeFactory.createCake("banana");
    }
}

查看结果:

方案二:工厂方法模式

定义蛋糕父类

/**
 * 蛋糕父类
 * @author:liyajie
 * @createTime:2022/2/14 10:44
 * @version:1.0
 */
public abstract class Cake {

}

定义苹果蛋糕

/**
 * 苹果蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class AppleCake extends Cake {
    public AppleCake(){
        System.out.println("创建了苹果蛋糕实例");
    }
}

定义香蕉蛋糕

/**
 * 香蕉蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class BananaCake extends Cake {
    public BananaCake(){
        System.out.println("创建了香蕉蛋糕实例");
    }
}

定义蛋糕工厂类 该类主要是定义了createCake抽象方法,并且在无参构造函数中进行调用,具体的实现是在子类里进行实例化的

/**
 * 蛋糕工厂类
 * @author:liyajie
 * @createTime:2022/2/14 11:55
 * @version:1.0
 */
public abstract class CakeFactory {

    abstract Cake createCake();

    public CakeFactory() {
        createCake();
    }
}

定义苹果蛋糕工具类

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 11:58
 * @version:1.0
 */
public class AppleCakeFactory extends CakeFactory{

    @Override
    public Cake createCake() {
        return new AppleCake();
    }
}

定义香蕉蛋糕工具类

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 11:58
 * @version:1.0
 */
public class BananaCakeFactory extends CakeFactory{
    @Override
    public Cake createCake() {
        return new BananaCake();
    }
}

定义测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/14 12:02
 * @version:1.0
 */
public class Test {
    public static void main(String[] args) {
        AppleCakeFactory appleCakeFactory = new AppleCakeFactory();

        BananaCakeFactory bananaCakeFactory = new BananaCakeFactory();
    }
}

查看结果

方案三:抽象工厂模式

定义蛋糕父类

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 10:44
 * @version:1.0
 */
public abstract class Cake {

}

定义苹果蛋糕

/**
 * 苹果蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class AppleCake extends Cake {
    public AppleCake(){
        System.out.println("创建了苹果蛋糕实例");
    }
}

定义香蕉蛋糕

/**
 * 香蕉蛋糕
 * @author:liyajie
 * @createTime:2022/2/14 10:17
 * @version:1.0
 */
public class BananaCake extends Cake {
    public BananaCake(){
        System.out.println("创建了香蕉蛋糕实例");
    }
}

定义蛋糕工厂类

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 11:55
 * @version:1.0
 */
public interface CakeFactory {

    Cake createCake();
}

定义苹果蛋糕工厂类

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 11:58
 * @version:1.0
 */
public class AppleCakeFactory implements CakeFactory {

    @Override
    public Cake createCake() {
        return new AppleCake();
    }
}

定义香蕉蛋糕工厂类

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 11:58
 * @version:1.0
 */
public class BananaCakeFactory implements CakeFactory {
    @Override
    public Cake createCake() {
        return new BananaCake();
    }
}

定义蛋糕工厂生成器

/**
 * @desc:
 * @author:liyajie
 * @createTime:2022/2/14 17:46
 * @version:1.0
 */
public class FactoryProducter {

    CakeFactory cakeFactory;

    public FactoryProducter(CakeFactory cakeFactory){
        setCakeFactory(cakeFactory);
    }

    public void setCakeFactory(CakeFactory cakeFactory){
        this.cakeFactory = cakeFactory;
        cakeFactory.createCake();
    }
}

定义测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/14 12:02
 * @version:1.0
 */
public class Test {
    public static void main(String[] args) {
        new FactoryProducter(new AppleCakeFactory());
        new FactoryProducter(new BananaCakeFactory());
    }
}

查看结果

对比分析

  • 方案一:简单工厂模式,工厂类是只有一个,只需要改动这一个地方 避免了业务逻辑的代码和创建对象的代码大量耦合,降低耦合 让代码更加条理清晰,更加优雅
  • 方案二:工厂方法模式是简单工厂模式的衍生,定义一个创建对象的抽象方法,由子类决定要实例化的类,将对象实例化延迟到子类,实现了可扩展,层次结构更复杂,可以应用到更复杂的场合
  • 方案三:抽象工厂模式,定义一个接口来用于创建相关的或者具有依赖关系的对象簇,将实例化对象的细节提取出来,放到工厂角色,由工厂角色负责具体的创建细节,解耦合,提高项目可扩展性和可维护性

总结

通过以上三个案例,对比分析我们明确了三种工厂模式实现的方式,也对比分析了各个工厂模式的优点。但是切记,实际开发过程中,不要盲目的使用,一定要结合具体的业务,实际分析后才去使用。

到此这篇关于Java设计模式之工厂模式案例详解的文章就介绍到这了,更多相关Java工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot 多模块将dao(mybatis)项目拆分出去

    springboot 多模块将dao(mybatis)项目拆分出去

    这篇文章主要介绍了springboot 多模块将dao(mybatis)项目拆分出去,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 详谈spring中bean注入无效和new创建对象的区别

    详谈spring中bean注入无效和new创建对象的区别

    这篇文章主要介绍了spring中bean注入无效和new创建对象的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 区分Java中的ArrayList和LinkedList

    区分Java中的ArrayList和LinkedList

    这篇文章主要介绍了如何区分Java中ArrayList和LinkedList,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java实现飞机大战-II游戏详解

    Java实现飞机大战-II游戏详解

    《飞机大战-II》是一款融合了街机、竞技等多种元素的经典射击手游。游戏是用java语言实现,采用了swing技术进行了界面化处理,感兴趣的可以了解一下
    2022-02-02
  • Java工程师面试题一面二面整理

    Java工程师面试题一面二面整理

    在本篇文章里小编给大家整理的是关于Java 工程师面试题的相关知识点,有需要的可以参考下。
    2019-08-08
  • IDEA的Mybatis Generator驼峰配置问题

    IDEA的Mybatis Generator驼峰配置问题

    这篇文章主要介绍了IDEA的Mybatis Generator驼峰配置问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Spring Boot 集成 ElasticSearch应用小结

    Spring Boot 集成 ElasticSearch应用小结

    这篇文章主要介绍了Spring Boot 集成 ElasticSearch应用小结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • SpringBoot实现动态数据源切换的项目实践

    SpringBoot实现动态数据源切换的项目实践

    在实际开发过程中,我们经常遇到需要同时操作多个数据源的情况,本文主要介绍了SpringBoot实现动态数据源切换的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Java合并两个及以上有序链表的示例详解

    Java合并两个及以上有序链表的示例详解

    这篇文章主要通过两个例题为大家介绍一下Java合并两个及以上有序链表的实现方法,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2022-11-11
  • 基于Java文件输入输出流实现文件上传下载功能

    基于Java文件输入输出流实现文件上传下载功能

    这篇文章主要为大家详细介绍了基于Java文件输入输出流实现文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04

最新评论