找回密码
 立即注册
首页 业界区 业界 工厂模式之工厂方法模式

工厂模式之工厂方法模式

赖琳芳 昨天 01:22
大家好,欢迎来到程序视点!
前言

在上一节的简单工厂模式中,我们知道简单工厂所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
也就是说,类的创建依赖工厂类,如果想要拓展程序(添加新的类),必须对工厂类进行修改。这违背了开闭原则。
从设计角度考虑,有一定的问题,如何解决?
既然要遵循【开闭原则】,工厂类肯定是不能修改了。那就只能用新的工厂来创建新的类--具体的类由具体的工厂来创建.
新添加的“具体的类”可能是不确定的,可能是“XiaomiPhone”,也有可能是“OppoPhone”,还可能是未来会出现的“XXXPhone”...那它们对应的工厂类就应该有“XiaomiPhoneFactory”,“OppoPhoneFactory”,“XXXPhoneFactory”...
我们把这些工厂类进一步抽象,就形成了我们接下来要讲的工厂方法模式
1.webp

工厂方法模式简介

定义一个创建对象的抽象方法,且可以创建多个不同的工厂类实现该抽象方法。要创建某个具体的类,就新增一个具体的工厂类;这个工厂类通过实现抽象方法来创建类。这就是我们说的工厂方法模式。
这样的好处就是:想要新创建一个类,不用修改原来的类,而是自己新建一个属于自己的工厂类。
从上面的描述中,我们可以抽象出这么几个角色:

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

抽象工厂:
  1. public interface PhoneFactory {
  2.   public Phone createPhone();
  3. }
复制代码
怎么是个接口呢?只有抽象方法的类,当然可以声明为接口呀!
产品类工厂:“HuaweiPhoneFactory”和“ApplePhoneFactory”
  1. public class HuaweiPhoneFactory
  2.               implements PhoneFactory {
  3.   public Phone createPhone() {
  4.     return new HuaweiPhone();
  5.   }
  6. }
复制代码
  1. public class ApplePhoneFactory
  2.               implements PhoneFactory {
  3.   public Phone createPhone() {
  4.     return new ApplePhone();
  5.   }
  6. }
复制代码
让我们来测试下:
  1. public class Test {
  2.   public static void main(String[] args) {
  3.     PhoneFactory huaweiPhoneFactory = new HuaweiPhoneFactory();
  4.     Phone phone1 = huaweiPhoneFactory.createPhone();
  5.     System.out.println(phone1.info());
  6.    
  7.     PhoneFactory applePhoneFactory = new ApplePhoneFactory();
  8.     Phone phone2 = applePhoneFactory.createPhone();
  9.     System.out.println(phone2.info());
  10.   }
  11. }
复制代码
输出:
我是华为手机
我是苹果手机
咿呀!和简单工厂模式一样的呐!
现在我们要创建“小米手机”啦
新增一个 XiaomiPhone 的实体类:
  1. public class XiaomiPhone implements Phone{
  2.   @Override
  3.   public String info() {
  4.     return "我是小米手机";
  5.   }
  6. }
复制代码
新增一个创建 XiaomiPhone 对象的工厂类:
  1. public class XiaomiPhoneFactory
  2.               implements PhoneFactory {
  3.   public Phone createPhone() {
  4.     return new XiaomiPhone();
  5.   }
  6. }
复制代码
测试一下:
  1. public class Test {
  2.   public static void main(String[] args) {
  3.     PhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();
  4.     Phone phone3 = xiaomiPhoneFactory.createPhone();
  5.     System.out.println(phone3.info());
  6.   }
  7. }
复制代码
输出:
我是小米手机
哈哈!我们没有修改之前的HuaweiPhoneFactory或ApplePhoneFactory两个工厂类,通过新增XiaomiPhoneFactory工厂类的方式来生产新的XiaomiPhone


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册