首页 > 其他分享 >工厂模式之工厂方法模式

工厂模式之工厂方法模式

时间:2023-09-15 16:15:40浏览次数:28  
标签:模式 public Phone 华为 new 工厂 方法 class

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

前言

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

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

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

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

新添加的“具体的类”可能是不确定的,可能是“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,Phone,华为,new,工厂,方法,class
From: https://www.cnblogs.com/tanggoahead/p/17705217.html

相关文章

  • Navicat连接Mysql数据显示2059 - authentication plugin ‘caching_sha2_password‘的
    安装Mysql8.0,使用navicat登录时显示如下错误提示 错误原因:MySQL新版本(8以上版本)的用户登录账户加密方式是【caching_sha2_password】,Navicat不支持这种用户登录账户加密方式。解决办法:1.打开MySQL命令行客户端 2.输入登录密码登录,查看加密方式,命令:showvariableslike'd......
  • 设计模式 C++
    (设计模式)(李建忠C++)23种设计模式组件协作模板方法父类中定义组件(函数)的调用流程,每个组件使用虚函数进行实现,然后子类中可以重写父类中虚函数的实现。如果我们发现一个算法的组件(函数)的调用流程都是一样的,但是步骤中的各个组件的实现可能有所差异,此时会使用模板方法。【......
  • JavaSE(05) -方法
    JavaSE(05)-方法p63什么是方法什么是方法:方法是程序当中最小的执行单元.应用场景:重复的代码,具有独立功能的代码可以抽取的方法中.他的好处:提高代码的复用性和可维护性.p64简单的方法定义和调用方法的命名规则:见名之意,驼峰命名.方法的运行:看到方法......
  • MySQL 切换数据库、用户卡死:“You can turn off this feature to get a quicker start
    数据量很大的话,常规切换数据库会把里面所有的表遍历一遍,会很慢甚至是卡死。解决方法:登录的时候直接在最后面加一个-A就行了。[root@localhost~]#"/usr/local/mysql-8.0.11/bin/mysql"-uroot-p123456-A 实战演示:我演示的数据库就是一个数据量很大的数据库,切换数据库......
  • 使用深度远程启动管理器配置BMC DHCP管理地址的方法
    1.请确保服务器BMC口或者/IDRAC口是DHCP状态,才可以使用深度工具分配地址;若BMC配置过静态地址,请使用静态地址登录;2.配置好自己笔记本的ip(例如:192.168.10.1),用网线与ipmi独立管理口直连;笔记本请务必关闭防火墙和杀毒软件;3.可自行网上下载深度远程启动管理器;下载后,打开文件夹,双......
  • 【Python】Python 发布订阅模式实现松耦合
    Python发布订阅模式实现松耦合发布订阅模式(publish/subscribe或pub/sub)是一种编程模式,消息的发送者(发布者)不会发送其消息给特定的接收者(订阅者),而是将发布的消息分为不同的类别直接发布,并不关注订阅者是谁。而订阅者可以对一个或多个类别感兴趣.且只接收感兴趣的消息,并且......
  • less-匹配模式
    //匹配模式有点像函数重载.arrow{width:0;height:0;overflow:hidden;border-width:10px;border-color:transparenttransparentlimegreentransparent;border-style:dasheddashedsoliddashed;}.triangle(top,@b-width:5px,@b-color:red){bo......
  • 软件设计模式系列之六——单例模式
    1模式的定义单例模式(SingletonPattern)是一种常见的创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这意味着无论何时何地,只要需要该类的实例,都会返回同一个实例,而不是创建多个相同的实例。单例模式通常用于管理全局状态、资源共享或限制......
  • 单例模式
    Analyser*Analyser::Instance(){staticQMutexmutex;staticQScopedPointer<Analyser>inst;if(Q_UNLIKELY(!inst)){mutex.lock();if(!inst){inst.reset(newAnalyser);}mutex.unlock();}......
  • 智能工厂和传统工厂有什么不同?如何转型?
    传统工厂依赖人工进行生产和管理,往往只能通过扩大规模来实现生产效益的提升,而智能工厂则是依靠现代化的智能装备,逐步替代人工进行重复性和工作量大的工作,实现智能化的生产经营模式和自动化的管理,可以有效的提升生产效率、节约成本。两者存在以下不同: 1、自动化程度智能工厂具备更......