• JAVA中的工厂方法模式和抽象工厂模式


    工厂方法模式:

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
    类型:创建类模式
    类图:

    类图知识点:
    1.类图分为三部分,依次是类名、属性、方法
    2.以<<开头和以>>结尾的为注释信息
    3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见。
    4.带下划线的属性或方法代表是静态的。

    工厂方法模式代码

    interface IProduct {
    public void productMethod();
    }
    class Product implements IProduct {
    public void productMethod() {
    System.out.println("产品");
    }
    }
    interface IFactory {
    public IProduct createProduct();
    }
    class Factory implements IFactory {
    public IProduct createProduct() {
    return new Product();
    }
    }
    public class Client {
    public static void main(String[] args) {
    IFactory factory = new Factory();
    IProduct prodect = factory.createProduct();
    prodect.productMethod();
    }
    }
    

      

    工厂模式:
    首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文
    所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经常用到的一种模式。它的主要优点有:
    • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂
    模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己
    想要的产品。
    • 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调
    用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
    • 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无
    需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来
    说,产品所依赖的类都是透明的。

    工厂方法模式:
    通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:
    • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会
    使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
    • 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多
    少个具体的工厂实现。
    • 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品
    接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用
    抽象类来代替,但要注意最好不要违反里氏替换原则。
    • 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。

    前文提到的简单工厂模式跟工厂方法模式极为相似,区别是:简单工厂只有三个要素,他没有工厂接口,并且得
    到产品的方法一般是静态的。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱,可以算所工厂方法模式的
    简化版,关于简单工厂模式,在此一笔带过。

    适用场景:
    不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似
    的。
    首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地
    方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂
    模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
    其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需
    要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。
    再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当
    需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

    典型应用
    要说明工厂模式的优点,可能没有比组装汽车更合适的例子了。场景是这样的:汽车由发动机、轮、底盘组
    成,现在需要组装一辆车交给调用者。假如不使用工厂模式,代码如下:

    class Engine {
    public void getStyle(){
    System.out.println("这是汽车的发动机");
    }
    }
    class Underpan {
    public void getStyle(){
    System.out.println("这是汽车的底盘");
    }
    }
    class Wheel {
    public void getStyle(){
    System.out.println("这是汽车的轮胎");
    }
    }
    public class Client {
    public static void main(String[] args) {
    Engine engine = new Engine();
    Underpan underpan = new Underpan();
    Wheel wheel = new Wheel();
    ICar car = new Car(underpan, wheel, engine);
    car.show();
    }
    }
    

      

    可以看到,调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关
    的,严重违反了迪米特法则,耦合度太高。并且非常不利于扩展。另外,本例中发动机、底盘和轮胎还是比较具
    体的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道怎样组装产品。假如使用工厂方法
    的话,整个架构就显得清晰了许多。

    interface IFactory {
    public ICar createCar();
    }
    class Factory implements IFactory {
    public ICar createCar() {
    Engine engine = new Engine();
    Underpan underpan = new Underpan();
    Wheel wheel = new Wheel();
    ICar car = new Car(underpan, wheel, engine);
    return car;
    }
    }
    public class Client {
    public static void main(String[] args) {
    IFactory factory = new Factory();
    ICar car = factory.createCar();
    car.show();
    }
    }
    

      

    使用工厂方法后,调用端的耦合度大大降低了。并且对于工厂来说,是可以扩展的,以后如果想组装其他的汽
    车,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。

    抽象工厂模式:

    抽象工厂模式
    定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
    类型:创建类模式
    类图:

    抽象工厂模式与工厂方法模式的区别:


    抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别
    就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程
    中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一
    个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
    在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成
    的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结
    构。我们依然拿生产汽车的例子来说明他们之间的区别。

    在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品
    族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另
    一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一
    个产品族。
    明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一
    个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果
    一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;如果一个工厂模式是提供2.4排量
    两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等
    级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模
    式了。

    interface IProduct1 {
    public void show();
    }
    interface IProduct2 {
    public void show();
    }
    class Product1 implements IProduct1 {
    public void show() {
    System.out.println("这是1型产品");
    }
    }
    class Product2 implements IProduct2 {
    public void show() {
    System.out.println("这是2型产品");
    }
    }
    interface IFactory {
    public IProduct1 createProduct1();
    public IProduct2 createProduct2();
    }
    class Factory implements IFactory{
    public IProduct1 createProduct1() {
    return new Product1();
    }
    public IProduct2 createProduct2() {
    return new Product2();
    }
    }
    public class Client {
    public static void main(String[] args){
    IFactory factory = new Factory();
    factory.createProduct1().show();
    factory.createProduct2().show();
    }
    }
    

      

    抽象工厂模式的优点
    抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产
    品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描
    述,而不必专门引入一个新的类来进行管理。


    抽象工厂模式的缺点
    产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行
    修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。


    适用场景
    当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是
    一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存

    在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则

    使用多个独立的工厂来对产品进行创建,则更合适一点。


    总结
    无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似
    的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模
    式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍
    加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而
    对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
    所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
    第 1 章 23 种设计模式 | 15

  • 相关阅读:
    Java集合框架之Set接口浅析
    Java集合框架之Vector浅析
    Java集合框架之LinkedList浅析
    Java集合框架之ArrayList浅析
    Java集合框架之List接口浅析
    数据库设计==>>MySchool
    Windows程序==>>使用ListView控件展示数据
    Windows程序控件升级==>>构建布局良好的Windows程序
    窗体==>>初始Windows程序
    数据库的有关知识==>>我们的血泪史之经典练习(1-2)
  • 原文地址:https://www.cnblogs.com/ttty/p/10435306.html
Copyright © 2020-2023  润新知