java设计模式(二)——简单工厂模式

一、模式介绍

1、工厂模式

工厂模式属于创建型模式,即解决的是如何创建一个类的对象问题。

常见的创建对象是自己使用new,这样是不是感觉有点普通,

如果有一种高逼格的方式可以将对象创建出来,是不是让人刮目相看。

工厂模式就能让你做到这一点。

2、分类

简单工厂模式

工厂方法

抽象工厂

3、使用场景

1.不想自己new对象,防止这个类改变的时候在new的地方到处去改,麻烦且容易遗漏

2.要创建类的对象构建过程非常复杂,不想在代码的各个地方将这么复杂的构建过程反复书写

3.这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供

二、简单工厂模式

1、实现步骤

第一步:定义产品抽象类,比如鞋子(Shoes.class)
java 复制代码
// 1、定义鞋 产品抽象基类
abstract class Shoes {
    // 展示logo
    public abstract void showLogo();
}
第二步:定义具体产品类,继承产品抽象类。比如飞跃牌鞋子(FeiYueShoes.class)、回力牌鞋子(HuiLiShoes.class)
java 复制代码
//2.定义具体品牌的鞋类,继承鞋抽象基类
public class FeiYueShoes extends Shoes {

    @Override
    public void showLogo() {
        System.out.println("这是飞跃鞋");
    }
}
java 复制代码
//2.定义具体品牌的鞋类,继承鞋抽象基类
public class HuiLiShoes extends Shoes {
    @Override
    public void showLogo() {
        System.out.println("这是回力鞋");
    }
}
第三步:定义简单工厂类,使用一个静态工厂方法根据不同产品条件生成不同产品。比如鞋厂(ShoesFactory.class)
java 复制代码
// 3、定义简单工厂方法类,使用一个静态工厂方法来根据不同的品牌条件来产生不同品牌的鞋
public class ShoesFactory {

    // 静态工厂方法,生产鞋子
    public static Shoes produceShoes(String brand){

        Shoes shoes = null;
        switch (brand){
            case "feiyue":
                shoes = new FeiYueShoes();
                break;
            case "huili":
                shoes = new HuiLiShoes();
                break;
            default:
                System.out.println("错误品牌");
                break;
        }
        return shoes;
    }
}
第四步:使用简单工厂模式,生成产品。比如(ShoesFactoryExample.class)
java 复制代码
// 4、使用简单工厂模式,生成产品
public class ShoesFactoryExample {
    public static void main(String[] args) {
        //生产飞跃鞋子
        Shoes feiYueShoes = ShoesFactory.produceShoes("feiyue");
        feiYueShoes.showLogo();
        //生产回力鞋子
        Shoes huiLiShoes = ShoesFactory.produceShoes("huili");
        huiLiShoes.showLogo();
    }
}

2、总结

简单工厂模式的出现,使我们通过传入不同的参数类型,可以创建不同类型的对象实例。
将对象的构建完全交给简单工厂方法类(ShoesFactory.class)

3、缺点

违法开闭原则(对扩展开放,对修改关闭),破坏其内聚性,给维护带来额外开支,
比如新增一种产品(老北京布鞋)就要修改静态工厂方法,而不是扩展,这就是所谓违反了开闭原则
工厂方法模式解决了这一问题。
相关推荐
小蜗牛慢慢爬行5 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
shinelord明24 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
新手小袁_J29 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅30 分钟前
C#关键字volatile
java·redis·c#
Monly2131 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2333 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
钱多多_qdd44 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha1 小时前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_19284999061 小时前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏1 小时前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境