设计模式:工厂方式模式、抽象工厂模式

前言

在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。

工厂方法模式

工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

根据定义可以知道,工厂方法模式的实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。类的实例在子类中进行。
首先创建一个创建对象的接口ProgrammeFactory

public interface ProgrammeFactory {
    Video getVideo();
}

只有一个方法用于获取各类语言的教学视频,再定义两个子类去实现它

// 获取Java语言的教学视频
public class JavaProgrammeFactory implements ProgrammeFactory {

    @Override
    public Video getVideo() {
        System.out.println("获取Java视频教程");
        return new JavaVideo();
    }

}

// 获取Python语言的教学视频
public class PythonProgrammeFactory implements ProgrammeFactory {

    @Override
    public Video getVideo() {
        System.out.println("获取Python视频教程");
        return new PythonVideo();
    }

}

测试代码

public class FactoryMethodDemo {

    public static void main(String[] args) {
        ProgrammeFactory factory = new JavaProgrammeFactory();
        factory.getVideo();
        factory = new PythonProgrammeFactory();
        factory.getVideo();
    }
}

工厂方法模式适用场景:

  • 创建对象需要大量重复代码
  • 客户端(应用层)不依赖与产品类实例如何被创建、实现等细节
  • 一个类通过其子类来指定创建哪个对象

工厂方法模式优点:

  • 用户只需关心所需要产品对应的工厂,无需关心创建的细节
  • 加入新产品符合开闭原则,提供可扩展性

工厂方法模式缺点:

  • 类的个数容易过多,增加复杂性
  • 增加了系统的抽象性和理解难度

完整代码:工厂方法模式

抽象工厂模式

抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

抽象工厂模式主要用来解决产品族的问题。比如工厂模式中提到的两种语言,不止有教学视频,还有文章等,如此一来,就可以分为:Java视频、Java文章、Python视频、Python文章四种产品。其中Java视频和Java文章属于同一产品族,Python视频和Python文章属于同一产品族。而Java视频和Python视频属于不同产品族的同一产品等级,Java文章和Python文章也是如此。这时便要用到抽象工厂模式

首先创建一个创建对象的接口ProgrammeFactory

public interface ProgrammaFactory {

    Video getVideo();

    Article getArticle();
}

有两个方法用于获取视频教程和文章教程(同一产品族),再定义两个子类去实现它

// 获取Java产品族的工厂
public class JavaProgrammaFactory implements ProgrammaFactory {

    public Video getVideo() {
        System.out.println("获取Java视频教程");
        return new JavaVideo();
    }

    public Article getArticle() {
        System.out.println("获取Java文章教程");
        return new JavaArticle();
    }
}

// 获取Python产品族的工厂
public class PythonProgrammaFactory implements ProgrammaFactory {

    public Video getVideo() {
        System.out.println("获取Python视频教程");
        return new PythonVideo();
    }

    public Article getArticle() {
        System.out.println("获取Python文章教程");
        return new PythonArticle();
    }
}

测试代码

public class FactoryMethodDemo {

    public static void main(String[] args) {
        ProgrammaFactory factory = new JavaProgrammaFactory();
        factory.getVideo();
        factory.getArticle();

        factory = new PythonProgrammaFactory();
        factory.getVideo();
        factory.getArticle();
    }

}

抽象工厂模式适用场景:

  • 客户端(应用层)不依赖产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖与具体实现

抽象工厂模式优点:

  • 具体产品在应用层代码隔离,无需关心创建细节
  • 将一个系列的产品族统一到一起创建

抽象工厂模式缺点:

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品等级困难,需要修改抽象工厂的接口
  • 增加了系统的抽象性和理解难度

完整代码:抽象工厂模式

总结

工厂方法模式和抽象工厂模式都是用来创建对象的设计模式。调用者无需知道对象被创建的具体过程,对调用者来说工厂类就是一个黑盒。

工厂方法模式中,每个工厂只能生产一类产品,而抽象工厂模式中,每个工厂可以生产一系列产品。

发布了55 篇原创文章 · 获赞 107 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章