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、缺点

复制代码
违法开闭原则(对扩展开放,对修改关闭),破坏其内聚性,给维护带来额外开支,
比如新增一种产品(老北京布鞋)就要修改静态工厂方法,而不是扩展,这就是所谓违反了开闭原则
工厂方法模式解决了这一问题。
相关推荐
可乐加.糖16 分钟前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s91236010118 分钟前
rust 同时处理多个异步任务
java·数据库·rust
9号达人19 分钟前
java9新特性详解与实践
java·后端·面试
cg501723 分钟前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙31 分钟前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic1 小时前
Java基础 4.3
java·开发语言
非ban必选2 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西2 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
杉之2 小时前
选择排序笔记
java·算法·排序算法
Naive_72 小时前
蓝桥杯准备(前缀和差分)
java·职场和发展·蓝桥杯