java设计模式之工厂方法学习与掌握(代码片段)

邹奇 邹奇     2023-01-15     771

关键词:

定义

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

优点

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

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

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

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


缺点

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

模式结构与实现

工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等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设计模式之工厂模式(简单工厂模式+工厂方法模式)(代码片段)

  在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下,new操作符直接生成对象会带来一些问题。  举例来说,许多类型对象的创造需要一系列的... 查看详情

java23种设计模式之八:工厂方法模式(代码片段)

 定义:  定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。  我们把被创建的对象称为“产品”,把创... 查看详情

java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)(代码片段)

        在面向对象编程中,创建对象实例最常用的方式就是通过new操作符构造一个对象实例,但在某些情况下,new操作符直接生成对象会存在一些问题。举例来说,对象的创建需要一系列的步骤:可能需... 查看详情

设计模式之工厂模式详解(java)(代码片段)

目录一、工厂模式1.1简单工厂模式1.2工厂方法模式1.3抽象工厂模式一、工厂模式核心:1、实例化对象不再用new,用工厂方法2、选择实现类,创建对象统一管理和控制,从而将调用者跟实现类解耦。调用者不用知... 查看详情

设计模式之工厂模式详解(java)(代码片段)

目录一、工厂模式1.1简单工厂模式1.2工厂方法模式1.3抽象工厂模式一、工厂模式核心:1、实例化对象不再用new,用工厂方法2、选择实现类,创建对象统一管理和控制,从而将调用者跟实现类解耦。调用者不用知... 查看详情

设计模式之工厂方法模式(代码片段)

设计模式之工厂方法模式(一)什么是工厂方法模式  工厂方法模式也称为多态工厂模式,也是对象的创建模式。定义了一个创建产品对象的工厂接口或抽象类,将实际创建工作推迟到它的实现类或子类当中。核心工厂类不再... 查看详情

设计模式之工厂方法模式(代码片段)

设计模式之工厂方法模式  工厂方法模式定义:Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类 查看详情

设计模式之工厂方法模式(代码片段)

1.什么是工厂方法模式工厂方法模式同样属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成... 查看详情

设计模式之工厂方法模式(代码片段)

工厂方法模式工厂方法模式介绍工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式... 查看详情

设计模式之工厂方法和抽象工厂(代码片段)

全网最详细的工厂设计模式,本文主要是创建型设计模式中的工厂方法和抽象工厂,先由传统实现方式引出问题,接着对代码改进到简单工厂,后扩展到工厂方法,最后是抽象工厂模式,文中包括概念理解和相关实现代码。读者... 查看详情

设计模式之工厂方法模式(代码片段)

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。代码实现 publicinterfaceCarpublicvoidrun(); publicclassAudiimplementsCarpublicvoidrun()System.out.println("奥迪在跑!");publicclassBydimplementsC... 查看详情

java设计模式之模板方法学习与掌握(代码片段)

文章目录定义优点缺点模式的结构与实现模式的结构模式的实现应用场景定义定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。优... 查看详情

java设计模式之简单工厂模式(代码片段)

...工厂类,可以生成多个不同的产品,属于创建型设计模式,应用场景:对于产品种类相对较少的情况下,考虑使用简单工厂模式可以方便的创建所需的产品。使用简单工厂模式的用户只需要传入工厂类的参数&#... 查看详情

java设计模式之简单工厂模式(代码片段)

...工厂类,可以生成多个不同的产品,属于创建型设计模式,应用场景:对于产品种类相对较少的情况下,考虑使用简单工厂模式可以方便的创建所需的产品。使用简单工厂模式的用户只需要传入工厂类的参数&#... 查看详情

设计模式之工厂方法模式(代码片段)

...,就要修改工厂模式,增加新的判断。这么做违反了我们设计模式中的开闭原则。今天就来学习下可以帮助我们消除这些判断的工厂方法模式。定义:工厂方法(FactoryMethod)模式的意义是定义一个创建产品对象的工厂接口,将实际... 查看详情

设计模式之—2.工厂方法模式(代码片段)

1.工厂方法模式定义定义一个用于创建对象的接口,让子类决定具体实例话哪一个类。2.通用实现方式工厂方式通用实现方式类图如下:其中Product定义了产品的共性,是对事物的抽象,Creator为抽象创建类,即抽象工厂,具体如何... 查看详情

设计模式之工厂方法模式(代码片段)

什么时候需要对象的创建与使用分离对于不同类型的产品创建,使用不同的工厂类实现对象创建难度不同,比如某个service用到dao,dao的实现有redis,mysql,mongodb,创建dao的难度不同,需要的细节不同,如果把创建代码放到service... 查看详情