【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)

文章目录

其实工厂模式就是用一个代理类帮你创建管理对象,你就不用在代码层面去不断new对象的使用了。

创建对象和调用对象两者之间会解耦!

定义

工厂模式有三种:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象方法模式

简单工厂模式

简单工厂模式也叫静态工厂模式。

举个例子:你要去买一台手机,你不用关心手机是怎么生产出来的,里面的零件具体又是怎么制造的,这些通通都交给工厂去处理,你尽管去买手机就好了。

案例 | 代码

Phone顶层接口设计
java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 11:08
 */
public interface Phone {
    void getBrand();
}
Meizu品牌类
java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 11:09
 */
public class Meizu implements Phone{
    @Override
    public void getBrand() {
        System.out.println("魅族");
    }
}
Xiaomi品牌类
java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:35
 */
public class Xiaomi implements Phone{
    @Override
    public void getBrand() {
        System.out.println("小米");
    }
}
PhoneFactory工厂类

这个是简单工厂模式,又叫静态工厂,所以方法自然是静态的!而且这个工厂类负责帮我们创建对象,并且返回对象!

在这里我们可以先用硬编码的方式:

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:35
 */
public class PhoneFactory {
    public static Phone getPhone(String phone){
        if ("小米".equals(phone)){
            return new Xiaomi();
        } else if ("魅族".equals(phone)) {
            return new Meizu();
        }else {
            return null;
        }
    }
}
Customer 消费者类

这个类就类似一个客户端的作用把。

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:38
 */
public class Customer {
    public static void main(String[] args) {
        PhoneFactory.getPhone("小米").getBrand();
        PhoneFactory.getPhone("魅族").getBrand();
    }
}

工厂方法模式

工厂方法模式就是在上面简单工厂模式的基础上做了一些修改,具体的做法就是为每种不同品牌的手机都创建一个工厂独立生产。

案例 | 代码

如上,其他代码都不变,变化的部分是工厂那部分!

PhoneFactory工厂类

首先修改一下PhoneFactory工厂类,将:

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:35
 */
public class PhoneFactory {
    public static Phone getPhone(String phone){
        if ("小米".equals(phone)){
            return new Xiaomi();
        } else if ("魅族".equals(phone)) {
            return new Meizu();
        }else {
            return null;
        }
    }
}

修改为:

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:35
 */
public interface PhoneFactory {
     Phone getPhone();
}

新增的两个工厂类:

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 14:09
 */
public class MeizuFactory implements PhoneFactory{
    @Override
    public Phone getPhone() {
        return new Meizu();
    }
}
/**
 * @author linghu
 * @date 2024/7/5 14:08
 */
public class XiaomiFactory implements PhoneFactory{
    @Override
    public Phone getPhone() {
        return new Xiaomi();
    }
}

Customer 消费者类:

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:38
 */
public class Customer {
    public static void main(String[] args) {
//        PhoneFactory.getPhone("小米").getBrand();
//        PhoneFactory.getPhone("魅族").getBrand();
        Phone xiaomi=new XiaomiFactory().getPhone();
        Phone meizu=new MeizuFactory().getPhone();
        xiaomi.getBrand();
        meizu.getBrand();
    }
}

Java高级特性---工厂模式与反射的高阶玩法

我们先回顾一下上面的工厂模式用法,列举一下会发现:

  • 简单工厂模式的局限性在于:如果我们扩充手机的品牌,就会违反 开闭原则
  • 工厂方法模式的局限性在于:我们扩充手机品牌需要不断new更多对象 ,这是耦合的最大元凶!!
方案:反射+工厂模式

PhoneFactory工厂类

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:35
 */
public class PhoneFactory {
    public static Phone getInstance(String origin) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class<?> cls = Class.forName("com.linghu.factory." + origin);
        Phone brand=(Phone)cls.newInstance();
        return brand;
    }
}

Customer 消费者类

这个时候我们无需再new更多对象了,也不用写死了:

java 复制代码
/**
 * @author linghu
 * @date 2024/7/5 12:38
 */
public class Customer {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//        PhoneFactory.getPhone("小米").getBrand();
//        PhoneFactory.getPhone("魅族").getBrand();
//        Phone xiaomi=new XiaomiFactory().getPhone();
//        Phone meizu=new MeizuFactory().getPhone();
//        xiaomi.getBrand();
//        meizu.getBrand();
        PhoneFactory.getInstance("Xiaomi").getBrand();
    }
}

输入类名以后,反射创建对象,再通过工厂返回相关对象!!

总结

第一个静态工厂模式:在实际去开发中会发现比较常用,尽管上面讲了不符合(面向对象)OOP原则。
第二个工厂方法模式:不修改工厂类的前提,也就是说不修改已有类,实现对扩展是开发,对修改关闭。

相关推荐
躺平大鹅2 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟2 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder2 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者2 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺3 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart4 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP5 小时前
MyBatis-mybatis入门与增删改查
java
孟陬8 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌8 小时前
一站式了解四种限流算法
java·后端·go
华仔啊9 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java