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

本文介绍了工厂方法模式,包括模式的定义、特点、结构与实现,并探讨了其在开源软件如Collection Iterator和LoggerFactory中的应用。该模式通过定义一个创建产品对象的工厂接口,延迟了产品的具体创建到子类,提高了系统的扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 模式的定义与特点

1.1 模式的定义

  定义一个创建产品对象的工厂接口,将产品的创建工作推迟到具体子工厂类当中,满足创建型模式中“创建与使用相分离“的特点。
  我们把被创建出来的对象叫做产品,把创建的产品的对象称为工厂,如果要创建的产品不多,只需要一个工厂类就可以完成了,这种模式叫做“简单工厂模式“,它不属于 GOF 23 种经典设计模式,因为它新增产品时会违背“开闭原则“。工厂方法模式就是对简单工厂模式的进一步抽象化,其好处是在系统不修改原来的代码的情况下引进新的产品,即满足开闭原则。

1.2 模式的特点

  工厂方法模式的主要优点有:

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

  工厂方法模式的缺点有:

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

2. 模式的结构与实现

  工厂方法模式是由抽象工厂,具体工厂,抽象产品和具体产品等四个要素组成。

2.1 模式的结构

  工厂方法的主要角色如下:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,客户端通过它访问具体工厂的工厂方法来创建产品;
  • 具体工厂(Concrete Factory):主要是实现抽象工厂种的抽象方法,完成具体产品的创建;
  • 抽象产品(Abstract Product):定义了产品的规范,描述了产品的特性和功能;
  • 具体产品(Concrete Product):实现了抽象产品所定义的功能,由具体工厂来创建,它同具体工厂一一对应。

在这里插入图片描述

2.2 模式的实现

  抽象产品类

/**
 * 产品抽象类,也可以是 abstract class
 */
public interface Video {

    void produce();

}

  具体产品类

/**
 * 具体产品
 */
public class JavaVideo implements Video {

    @Override
    public void produce() {
        System.out.println("制作 Java 学习视频");
    }

}

/**
 * 具体产品
 */
public class PythonVideo implements Video {

    @Override
    public void produce() {
        System.out.println("制作 python 学习视频");
    }
}

  抽象工厂类

/**
 * 抽象工厂类,也可以为 abstract class
 */
public interface VideoFactory {

    Video getVideo();

}

  具体工厂类

/**
 * 具体工厂类
 */
public class JavaVideoFactory implements VideoFactory {

    @Override
    public Video getVideo() {
        return new JavaVideo();
    }

}

/**
 * 具体工厂类
 */
public class PythonVideoFactory implements VideoFactory {

    @Override
    public Video getVideo() {
        return new PythonVideo();
    }
}

  客户端

public class Client {

    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        Video video = videoFactory.getVideo();
        video.produce();

        videoFactory = new PythonVideoFactory();
        video = videoFactory.getVideo();
        video.produce();
    }

}

3. 模式在开源软件中的应用

3.1 Collection Iterator

/**
 * Collection 抽象工厂类,其中 Iterator 为抽象产品
 */
Iterator<E> iterator();

/**
 * ArrayList 具体工厂,每个具体工厂创建自己的Iterator实现,Itr 为具体产品
 */
 public Iterator<E> iterator() {
    return new Itr();
}

3.2 LoggerFactory getLogger

/**
 * LoggerFactory,客户端
 */
public static Logger getLogger(String name) {
    ILoggerFactory iLoggerFactory = getILoggerFactory();
    return iLoggerFactory.getLogger(name);
}

/**
 * 抽象工厂,有三个实现该接口的子类,Logger 为抽奖产品
 */
public interface ILoggerFactory {
    Logger getLogger(String var1);
}

/**
 * 具体工厂,创建具体的 Logger 对象产品
 */
public class LoggerContext extends ContextBase implements ILoggerFactory, LifeCycle {
     public final Logger getLogger(Class clazz) {
        return this.getLogger(clazz.getName());
    }   
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值