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

第三章_工厂模式

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

相关推荐
Cyber4K10 分钟前
【Python专项】Nginx访问日志分析时间范围处理示例
开发语言·python·nginx
中犇科技19 分钟前
郑州无代码APP开发公司哪家好呢?推荐
开发语言
周末也要写八哥23 分钟前
代码中的注释的重要性(二)
开发语言·python
殷紫川27 分钟前
90% Java 开发都踩过坑的 @Resource 与 @Autowired
java
kybs199137 分钟前
springboot租车系统--附源码68701
java·hadoop·spring boot·python·django·asp.net·php
Dabei1 小时前
Android 无障碍服务实现美团/微信自动化:客户端开发实践
前端·设计模式
过期动态1 小时前
MySQL中的约束
android·java·数据库·spring boot·mysql
wxin_VXbishe1 小时前
springboot新能源车充电站管理系统小程序-计算机毕业设计源码29213
java·c++·spring boot·python·spring·django·php
程序员陆通1 小时前
月烧 400 刀到不到 20 刀:我是怎么把 OpenClaw 的 Token 账单砍掉 95% 的
java·前端·数据库
江南十四行2 小时前
Python生成器与协程:从迭代器到异步编程的进阶之路
开发语言·python