工厂模式之工厂方法模式

这篇具有很好参考价值的文章主要介绍了工厂模式之工厂方法模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,欢迎来到程序视点!

前言

在上一节的简单工厂模式中,我们知道简单工厂所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

也就是说,类的创建依赖工厂类,如果想要拓展程序(添加新的类),必须对工厂类进行修改。这违背了开闭原则。

从设计角度考虑,有一定的问题,如何解决?

既然要遵循【开闭原则】,工厂类肯定是不能修改了。那就只能用新的工厂来创建新的类--具体的类由具体的工厂来创建.

新添加的“具体的类”可能是不确定的,可能是“XiaomiPhone”,也有可能是“OppoPhone”,还可能是未来会出现的“XXXPhone”...那它们对应的工厂类就应该有“XiaomiPhoneFactory”,“OppoPhoneFactory”,“XXXPhoneFactory”...

我们把这些工厂类进一步抽象,就形成了我们接下来要讲的工厂方法模式

工厂方法模式简介

定义一个创建对象的抽象方法,且可以创建多个不同的工厂类实现该抽象方法。要创建某个具体的类,就新增一个具体的工厂类;这个工厂类通过实现抽象方法来创建类。这就是我们说的工厂方法模式

这样的好处就是:想要新创建一个类,不用修改原来的类,而是自己新建一个属于自己的工厂类。

从上面的描述中,我们可以抽象出这么几个角色:

  • 抽象工厂:用来声明抽象方法的。 返回值就是产品抽象类。
  • 产品类工厂:专门生产某个具体产品的工厂类。
  • 产品抽象类:工厂类能创建出来的所有产品类的抽象。它负责描述所有实例所共有的公共接口。(这里必须要一个抽象类,不然不能保证返回的不同的产品类属于同一个类型)
  • 产品类:工厂类创建出来的目标。它(们)是产品抽象类的具体实现。

示例

抽象工厂:

public interface PhoneFactory {
  public Phone createPhone();
}

怎么是个接口呢?只有抽象方法的类,当然可以声明为接口呀!
产品类工厂:“HuaweiPhoneFactory”和“ApplePhoneFactory”

public class HuaweiPhoneFactory 
              implements PhoneFactory {
  public Phone createPhone() {
    return new HuaweiPhone();
  }
}
public class ApplePhoneFactory 
              implements PhoneFactory {
  public Phone createPhone() {
    return new ApplePhone();
  }
}

让我们来测试下:

public class Test {
  public static void main(String[] args) {
    PhoneFactory huaweiPhoneFactory = new HuaweiPhoneFactory();
 
    Phone phone1 = huaweiPhoneFactory.createPhone();
    System.out.println(phone1.info());
    
    PhoneFactory applePhoneFactory = new ApplePhoneFactory();
    Phone phone2 = applePhoneFactory.createPhone();
    System.out.println(phone2.info());
  }
}

输出:
我是华为手机
我是苹果手机

咿呀!和简单工厂模式一样的呐!

现在我们要创建“小米手机”啦
新增一个 XiaomiPhone 的实体类:

public class XiaomiPhone implements Phone{
  @Override
  public String info() {
    return "我是小米手机";
  }
}

新增一个创建 XiaomiPhone 对象的工厂类:

public class XiaomiPhoneFactory 
              implements PhoneFactory {
  public Phone createPhone() {
    return new XiaomiPhone();
  }
}

测试一下:

public class Test {
  public static void main(String[] args) {
    PhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();
 
    Phone phone3 = xiaomiPhoneFactory.createPhone();
    System.out.println(phone3.info());
  }
}

输出:
我是小米手机

哈哈!我们没有修改之前的HuaweiPhoneFactory或ApplePhoneFactory两个工厂类,通过新增XiaomiPhoneFactory工厂类的方式来生产新的XiaomiPhone

🆗,这样我们就完成了工厂方法模式创建和使用。

工厂方法模式的问题

工厂方法模式有什么问题呢?我们先来看一个场景:

现在“华为”和“苹果”都要开始生产电脑了。“华为”只能生产“华为电脑”,“苹果”只能生产“苹果电脑”。

按照上述的工厂方法模式,那就必然对应的抽象类、实体抽象类、实体类和实体工厂类。
抽象工厂:

public interface ComputerFactory {
  public Computer createComputer();
}
public abstract class Computer {
  public abstract String getName();
}
public class HuaweiComputer extends Computer{
  @Override
  public String getName() {
    return "我是华为电脑";
  }
}
public class AppleComputer extends Computer{
  @Override
  public String getName() {
    return "我是苹果电脑";
  }
}

产品类工厂:“HuaweiComputerFactory”和“AppleComputerFactory”

public class HuaweiComputerFactory
              implements ComputerFactory {
  public Computer createComputer() {
    return new HuaweiComputer();
  }
}
public class AppleComputerFactory 
              implements ComputerFactory {
  public Computer createComputer() {
    return new AppleComputer();
  }
}

🆗,Cool!我们一下就搞定了!

接着,“华为”和“苹果”都要开始生产智能手表了。“华为”只能生产“华为手表”,“苹果”只能生产“苹果手表”。

再接着,“华为”和“苹果”都要开始生产音响了。“华为”只能生产“华为音响”,“苹果”只能生产“苹果音响”。

...耳机,服务器,汽车等等

哇!随着产品类的增多,我们的工厂类似乎也增加了。这还不重要的,问题出在下面:

突然,我们要进行手机和电脑配对链接了!

public class Test {
  public static void main(String[] args) {
    PhoneFactory huaweiPhoneFactory = new HuaweiPhoneFactory();
    Phone phone1 = huaweiPhoneFactory.createPhone();
    
    PhoneFactory applePhoneFactory = new ApplePhoneFactory();
    Phone phone2 = applePhoneFactory.createPhone();
    
    ComputerFactory huaweiComputerFactory = new HuaweiComputerFactory();
    Computer computer1 = huaweiComputerFactory.createComputer();
    
    ComputerFactory appleComputerFactory = new AppleComputerFactory();
    Computer computer2 = appleComputerFactory.createComputer();
    
    // 匹配
    match(phone1, computer2);
  }
  
  public static void match(Phone p, Computer c) {
   System.out.println(p.info() + "===" + c.getName()) 
  }
}

输出:
我是华为手机===我是苹果电脑

看到了?华为手机匹配连接到苹果电脑上了!

大家知道问题了吗?怎么解决这个问题呢?我们下期见!

更多信息,请关注同名公众号【程序视点】,提前预览~

工厂模式之工厂方法模式文章来源地址https://www.toymoban.com/news/detail-709786.html

到了这里,关于工厂模式之工厂方法模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式专题之工厂方法模式】2.积木工厂

    时间限制:1.000S  空间限制:256MB 题目描述 小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。 输入描述 输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。  接下来的 N 行,每行输入一

    2024年03月14日
    浏览(55)
  • 设计模式之~工厂系列(简单工厂、工厂方法、抽象工厂)

    目录 简单工厂模式 工厂方法模式 简单工厂 VS 工厂方法 抽象工厂模式: 拓展: 利用简单工厂模式优化抽象工厂   利用反射+抽象工厂   进行优化 反射+配置文件+抽象工厂进行优化 优点:简单工厂模式的最大优点在于工厂类包含了必要的逻辑判断,根据客户端的选择条件动

    2024年02月07日
    浏览(54)
  • 常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)

    有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式) 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设计模式》GoF 解决创建过程比较复杂,希望对外隐藏

    2024年01月22日
    浏览(47)
  • 工厂制造细节无需知--工厂方法模式

    \\\"简单工厂只是最基本的创建实例相关的设计模式。但真实情况中,有更多复杂的情况需要处理。简单工厂生成实例的类,知道了太多的细节,这就导致这个类很容易出现难维护、灵活性差问题,让人感觉到了不好的味道。\\\" \\\"知道很多细节不太好吗?\\\" \\\"现实中,我们要想过好生

    2024年04月17日
    浏览(33)
  • 设计模式:简单工厂、工厂方法、抽象工厂的区别

    描述: 简单工厂模式并不是严格意义上的设计模式,而更像是一种编程习惯或者说是一种创建对象的简单方式。它使用一个工厂类来创建对象,这个工厂类包含一个方法,根据输入的参数或条件来创建相应的对象实例。 举例: 描述: 工厂方法模式是一种创建型模式,它定义

    2024年01月21日
    浏览(47)
  • 【设计模式】-工厂方法模式

    工厂方法模式(Factory Method Pattern)是一种 创建型 设计模式,它通过定义一个用于创建对象的接口,但是将 具体对象的创建 推迟到 子类 中。这样, 子类可以决定要实例化的对象类型 。工厂方法模式提供了一种方式,通过将对象的创建延迟到子类中,来解耦对象的生产和使

    2024年02月14日
    浏览(42)
  • 设计模式-工厂方法模式

         工厂方法模式(Factory Method Pattern)是一种常用的类创建型设计模式,它属于对象的创建型模式,主要用来封装对象的创建过程。在该模式中,一个抽象工厂定义了一个接口用于创建产品对象,但实际的实例化延迟到子类中进行,也就是说,具体的产品是由其对应的工厂

    2024年01月17日
    浏览(44)
  • 重温设计模式 --- 工厂方法模式

    工厂方法模式 是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类决定将哪一个类实例化。换句话说,工厂方法模式让一个类的实例化延迟到其子类。 工厂方法模式有以下几个主要角色: 抽象工厂(AbstractFactory):声明用于创建抽象产品的操作的接口。

    2024年02月13日
    浏览(48)
  • 设计模式-创建型模式-工厂方法模式

    工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorp

    2024年02月22日
    浏览(44)
  • 设计模式之工厂方法模式笔记

    记录下学习设计模式-工厂方法模式的写法。 意图 :定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 结构 : 其中: Product定义工厂方法所创建的对象的接口。 ConcreteProduct实现Product接口。 Creator声明工厂方法,该方法返回

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包