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

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


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

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

定义

工厂模式有三种:

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

简单工厂模式

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

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

案例 | 代码

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

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

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

/**
 * @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 消费者类

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

/**
 * @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工厂类,将:

/**
 * @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;
        }
    }
}

修改为:

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

新增的两个工厂类:

/**
 * @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 消费者类:

/**
 * @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工厂类

/**
 * @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更多对象了,也不用写死了:

/**
 * @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月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
33 0
|
2月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
43 0
|
4月前
|
设计模式
建模底层逻辑问题之以命令设计模式为例,要用定义法建模,如何实现
建模底层逻辑问题之以命令设计模式为例,要用定义法建模,如何实现
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 算法 Java
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
29 0
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
4月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
43 1
|
4月前
|
设计模式 算法 开发者
深入理解工厂模式与策略模式:设计模式的灵活应用
深入理解工厂模式与策略模式:设计模式的灵活应用
|
4月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
4月前
|
设计模式 微服务
设计模式问题之在软件设计中,“模块”如何定义和区分
设计模式问题之在软件设计中,“模块”如何定义和区分