【从零开始学设计模式】第三章_工厂模式

第三章_工厂模式

1.介绍

1.1定义

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

1.2解决的问题

创建者和调用者的耦合,那么代码层面其实就是取消对new的使用。

1.3应用实例

需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现

1.4方法

创建工厂模式的方法有三种:

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

1.5角色

  • 抽象产品:定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。
  • 具体产品:实现了抽象产品接口,定义了具体产品的特定行为和属性。
  • 抽象工厂:声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
  • 具体工厂:实现了抽象工厂接口,负责实际创建具体产品的对象。

2.举例

2.1简单工厂模式

2.1.1模式图

2.1.2代码举例

  • Phone接口
java 复制代码
public interface Phone {
    void getBrand();
}
  • Meizu品牌类
java 复制代码
public class Meizu implements Phone {
    @Override
    public void getBrand() {
        System.out.println("魅族");
    }
}
  • Xiaomi品牌类
java 复制代码
public class Xiaomi implements Phone {
    @Override
    public void getBrand() {
        System.out.println("小米");
    }
}
  • PhoneFactory工厂类
java 复制代码
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 复制代码
public class Customer {
    public static void main(String[] args) {
        PhoneFactory.getPhone("Xiaomi").getBrand();
        PhoneFactory.getPhone("Meizu").getBrand();
    }
}

2.1.3遇到的问题

随着手机品牌增多,工厂生产也需要对应的增加,工厂内部就需要不断的调整。

从代码层面------对内部代码的PhoneFactory工厂类需要增加(也就是需要修改内部代码:那么就会违反OOP原则---开闭原则:一个软件实体应当对扩展开放,对修改关闭。那怎么解决呢?

2.2工厂方法模式

2.2.1模式图

2.2.2代码

  • Phone接口
java 复制代码
public interface Phone {
    void getBrand();
}
  • PhoneFactory接口
java 复制代码
public interface PhoneFactory {
    Phone getPhone();
}
  • Xiaomi品牌类
java 复制代码
public class Xiaomi implements Phone {
    @Override
    public void getBrand() {
        System.out.println("小米");
    }
}
  • XiaomiFactory工厂类
java 复制代码
public class XiaomiFactory implements PhoneFactory {
    @Override
    public Phone getPhone() {
        return new Xiaomi();
    }
}
  • MeiZu品牌类
java 复制代码
public class MeiZu implements Phone {
    @Override
    public void getBrand() {
        System.out.println("魅族");
    }
}
  • MeiZuFactory工厂类
java 复制代码
public class MeizuFactory implements PhoneFactory{
    @Override
    public Phone getPhone() {
        return new Meizu();
    }
}
  • 消费者
java 复制代码
public class Customer {
    public static void main(String[] args) {
        Phone xiaomi = new XiaomiFactory().getPhone();
        Phone meizu = new MeizuFactory().getPhone();
        xiaomi.getBrand();
        meizu.getBrand();
    }
}

2.2.3优缺点

工厂方法模式解决简单工厂模式是需要付出代价的!

看到上图工厂方法模式图里==新增用虚线画的Huawei品牌,每新增一个品牌就需要增加,对应新的工厂==,会发现需要花费很大的成本,现在才三个新的品牌,那么等到十个、一百个的时候就会变得更加的复杂和难以维护。

3.JDK 中的工厂模式

4.优缺点

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

4.1工厂方法模式优点

(1)良好的封装性、代码结构清晰。

如一个调用者想创建一个对象,只需要知道其名称即可,降低了模板间的耦合。

(2)扩展性好。

如果想增加一个产品,只需扩展一个工厂类即可。

(3)屏蔽产品类

调用者只关心产品的接口。

(4)典型的解耦框架

4.2工厂方法模式缺点

每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度。

5.应用

5.1何时使用

不同条件下创建不同实例时。方法是让子类实现工厂接口。

5.2使用场景

(1)需要生成对象的地方。

(2)需要灵活的、可扩展的框架。

(3)数据库访问、数据库可能变化时。

5.3应用实例

(1) 需要一辆汽车,直接从工厂里面提货,不用去管这辆车是怎么做出来的。

(2)hibernate换数据库只需换方言和驱动即可。

(3)简单计算器的实现。

相关推荐
程序员JerrySUN4 分钟前
Linux 内核内存管理子系统全面解析与体系构建
java·linux·运维
q567315237 分钟前
分布式增量爬虫实现方案
开发语言·分布式·爬虫·python
勤奋的知更鸟12 分钟前
LLaMA-Factory和python版本的兼容性问题解决
开发语言·python·llama-factory
CIb0la15 分钟前
Ai自动补全编程工具:llama vscode
运维·开发语言·学习·测试工具·程序人生
风象南19 分钟前
SpringBoot的5种签到打卡实现方案
java·spring boot·后端
1candobetter24 分钟前
JAVA后端开发——多租户
java·开发语言
freyazzr1 小时前
C++八股 | Day3 | 智能指针 / 内存管理 / 内存分区 / 内存对齐
开发语言·c++
序属秋秋秋1 小时前
《C++初阶之入门基础》【普通引用 + 常量引用 + 内联函数 + nullptr】
开发语言·c++·笔记
星辰离彬1 小时前
Java 高级泛型实战:8 个场景化编程技巧
java·开发语言·后端·程序人生
筏.k1 小时前
C++ 网络编程(10) asio处理粘包的简易方式
java·网络·c++