Java 设计模式之工厂方法学习与掌握

Posted 邹奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之工厂方法学习与掌握相关的知识,希望对你有一定的参考价值。

定义

  • 定义一个用于创建产品的接口,由子类决定生产什么产品。

优点

  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则依赖倒置原则里氏替换原则

迪米特法则:又叫作最少知识原则。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。

里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。


缺点

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度
  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决

模式结构与实现

工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。

模式结构

该模式的4个角色如下:

  1. 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 createProduct() 来创建产品。
  2. 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

总之,记住:工厂是跟产品相关的。工厂接口就定义创建产品的接口方法,返回类型为抽象产品类型;具体工厂就创建具体产品返回给调用方。


模式实现

首先是抽象工厂,如下:

package com.example.designmodedemo.principle.method_factory;

/**
 * 抽象工厂
 */
public interface IFactory {

    Product createProduct();// 工厂生成产品

}

具体工厂例子给出两个,如下:

package com.example.designmodedemo.principle.method_factory;

/**
 * 具体工厂1
 */
public class Factory1 implements IFactory{
    @Override
    public Product createProduct() {
        System.out.println(":> 我是工厂1,准备生产");
        return new Product1();
    }
}

package com.example.designmodedemo.principle.method_factory;

/**
 * 具体工厂2
 */
public class Factory2 implements IFactory{
    @Override
    public Product createProduct() {
        System.out.println(":> 我是工厂2,准备生产");
        return new Product2();
    }
}

然后是抽象产品,如下:

package com.example.designmodedemo.principle.method_factory;

public interface Product {

    void show();// 显示产品信息

}

具体产品例子给出两个,如下:

package com.example.designmodedemo.principle.method_factory;

/**
 * 具体产品1(由具体工厂1生产)
 */
public class Product1 implements Product{
    @Override
    public void show() {
        System.out.println(":> 我是具体产品1,由具体工厂1生成");
    }
}

package com.example.designmodedemo.principle.method_factory;

/**
 * 具体产品2(由具体工厂2生产)
 */
public class Product2 implements Product{
    @Override
    public void show() {
        System.out.println(":> 我是具体产品2,由具体工厂2生成");
    }
}

调用方调用如下:

private void principle_method_factory() {
        IFactory iFactory = null;
        Product product = null;

        iFactory = new Factory1();// 这里使用构造方法模拟测试
        product = iFactory.createProduct();

        product.show();
    }

结果如下:


应用场景

  • 客户不关心创建产品的细节,只关心产品的品牌
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。

技术永不眠!我们下期见!

以上是关于Java 设计模式之工厂方法学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章

笔记之_java整理设计模式

Java代码实现设计模式之工厂模式

Java工厂模式之总有你想不到的知识

Java设计模式之工厂模式

java设计模式之工厂方法设计模式

设计模式之工厂模式详解(java)