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

复制代码
违法开闭原则(对扩展开放,对修改关闭),破坏其内聚性,给维护带来额外开支,
比如新增一种产品(老北京布鞋)就要修改静态工厂方法,而不是扩展,这就是所谓违反了开闭原则
工厂方法模式解决了这一问题。
相关推荐
符哥20083 分钟前
C++ 进阶知识点整理
java·开发语言·jvm
Sayuanni%315 分钟前
初阶_多线程1(线程含义与关键属性)
java
程序媛徐师姐16 分钟前
Java基于微信小程序的模拟考试系统,附源码+文档说明
java·微信小程序·java模拟考试系统小程序·模拟考试微信小程序·模拟考试系统小程序·模拟考试小程序·java模拟考试小程序
疯狂敲代码的老刘26 分钟前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
夕除27 分钟前
js--15
java·jvm·spring
曾经的三心草32 分钟前
redis-9-集群
java·redis·mybatis
sun032238 分钟前
【架构基础】Spring中的PropertySourcesPlaceholderConfigurer介绍 (并非新知识,比较古老的一种使用方式)
java·spring·架构
chilavert31840 分钟前
技术演进中的开发沉思-356:重排序(中)
java·开发语言
毕设源码-邱学长40 分钟前
【开题答辩全过程】以 基于SSM的儿童福利院管理系统为例,包含答辩的问题和答案
java·eclipse
TT哇1 小时前
【实习】数字营销系统 银行经理端(interact_bank)前端 Vue 移动端页面的 UI 重构与优化
java·前端·vue.js·ui