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

第三章_工厂模式

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)简单计算器的实现。

相关推荐
それども1 分钟前
Spring Boot 切面无法切进来的原因
java·spring·dubbo
mjhcsp3 分钟前
C++信息论超详解析
开发语言·c++
随风,奔跑4 分钟前
Spring Cloud Alibaba学习笔记(一)
java·后端·spring cloud
無限進步D8 分钟前
Java 基础算法训练
java·开发语言·算法·入门
map1e_zjc11 分钟前
Java SpringBoot学习记录(4)
java·开发语言·学习
小毛驴85015 分钟前
多线程同步打标记的几种实现方案
java·开发语言·python
Mr_Xuhhh15 分钟前
递归之美:合并两个有序链表的优雅解法
java·开发语言
bluebonnet2717 分钟前
【Python】一些PEP提案(五):注解的延迟求值
开发语言·python
橙露23 分钟前
Python 操作 MongoDB:非关系型数据查询与分析
开发语言·python·mongodb
小魏小魏我们去那里呀25 分钟前
Java2Flowchart:一款把 Java 方法一键转换成 Mermaid 流程图的 IntelliJ 插件
java·ide·intellij-idea