前言

Github:https://github.com/yihonglei/java-design-patterns

一 工厂模式作用

工厂模式(factory pattern)是一种常用的对象创建型设计模式,是用工厂方法代替new操作的一种模式。

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

我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,

所以以后new时就要多个心眼,但是可以考虑使用工厂模式,虽然这样做,可能多做一些工作,

但会给你系统带来更大的可扩展性和尽量少的修改量。

二 应用场景

(1)当一个类希望由它的子类来指定它所创建的对象的时候。

(2)当一个类不知道自己必须创建哪些对象的时候。

三 UML类图

工厂方法模式的静态类图:

四 参与对象

1)抽象工厂(Creator)角色

是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

2)具体工厂(Concrete Creator)角色

这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

3)抽象产品(Product)角色

工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

4)具体产品(Concrete Product)角色

这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

工厂模式分为工厂方法(Factory Method),抽象工厂(Abstract Factory)。这里主要说工厂方法模式。

五 工厂方法模式实战

实战类图:

product

package com.jpeony.design.patterns.factory;

/**
 * 抽象产品(Product)角色:
 * 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
 *
 * @author yihonglei
 */
public interface Work {
    void doWork();
}

Concrete Product

package com.jpeony.design.patterns.factory;

/**
 * 具体产品(Concrete Product)角色:实现接口对象为具体对象
 *
 * @author yihonglei
 */
public class StudentWork implements Work {

    @Override
    public void doWork() {
        System.out.println("学生做作业");
    }
}

package com.jpeony.design.patterns.factory;

/**
 * 具体产品(Concrete Product)角色:实现接口对象为具体对象
 *
 * @author yihonglei
 */
public class TeacherWork implements Work {
    @Override
    public void doWork() {
        System.out.println("老师批改作业");
    }
}

Creator

package com.jpeony.design.patterns.factory;

/**
 * 抽象工厂(Creator)角色:
 * 是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
 *
 * @author yihonglei
 */
public interface IWorkFactory {
    Work getWork();
}

Concrete Creator

package com.jpeony.design.patterns.factory;

/**
 * 具体工厂(Concrete Creator)角色:
 * 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
 *
 * @author yihonglei
 */
public class StudentWorkFactory implements IWorkFactory {
    @Override
    public Work getWork() {
        return new StudentWork();
    }
}

package com.jpeony.design.patterns.factory;

/**
 * 具体工厂(Concrete Creator)角色:
 * 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
 *
 * @author yihonglei
 */
public class TeacherWorkFactory implements IWorkFactory {
    @Override
    public Work getWork() {
        return new TeacherWork();
    }
}

Test

package com.jpeony.design.patterns.factory;

/**
 * 工厂方法模式应用程序测试,通过工厂创建具体产品对象。
 *
 * @author yihonglei
 */
public class FactoryMethodTest {
    public static void main(String[] args) {
        StudentWorkFactory studentWorkFactory = new StudentWorkFactory();
        studentWorkFactory.getWork().doWork();

        TeacherWorkFactory teacherWorkFactory = new TeacherWorkFactory();
        teacherWorkFactory.getWork().doWork();
    }
}

运行结果

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐