面试设计模式系列之工厂模式

面试设计模式系列之工厂模式

面试官:简单说一下工厂模式

你:

​ 工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法模式让类的实例化推迟到了子类中进行。

​ 核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

​ 比如创建一个课程工厂接口,然后使用java课程实现这个课程工厂接口,使用这个专门的java课程工厂来创建java课程,如果以后开设了另外一门课叫python课程,我们只要定义一个python课程工厂实现这个课程工厂接口即可。

简单工厂模式:

简单工厂模式适用于工厂类负责创建的对象较少的情况。且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。

客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品

创建对象的过程并不复杂,但从代码设计的角度来讲不易于拓展。

public class CourseFactory {
    public ICourse create(Class<? extends ICourse> clazz) {
        try {
            if (null != clazz) {
                return clazz.newInstance();
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}
CourseFactory courseFactory = new CourseFactory();
ICourse pythonCourse = courseFactory.create(PythonCourse.class);
pythonCourse.record();

工厂方法模式:

工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法模式让类的实例化推迟到了子类中进行。

工厂方法模式主要解决产品的拓展问题。

核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

vdfv

相比于简单工厂,随着产品链的丰富,如果每个课程的创建逻辑有区别,则工厂的职责会变得越来越多,有点像万能工厂,不便于维护,根据单一职责原则,我们应该将职能拆分,专人干专事。

首先定义一个接口,用来表示工厂类的方法:

public interface ICourseFactory {
    ICourse create();
}

创建java工厂,并实现工厂接口。

public class JavaCourseFactory implements ICourseFactory{
    @Override
    public ICourse create() {
        return new JavaCourse();
    }
}

创建java课程类时直接使用工厂类创建即可。

ICourseFactory courseFactory = new JavaCourseFactory();

工厂方法模式适用于以下场景:

  • 创建对象需要大量重复的代码
  • 客户端不依赖于产品类实例如何被创建、如何被实现等。
  • 一个类通过其子类来指定创建哪个对象。

抽象工厂模式:

是指提供一个创建一系列相关或者互相依赖对象的接口,无需制定他们的具体实现。

适用于一系列相关的产品对象,比如一个课程里面有视频,笔记对象等等。

创建视频和笔记接口

public interface INote {
    void edit();
}
public interface IVideo {
    void record();
}

创建课程工厂

public interface CourseFactory {
    INote createNote();

    IVideo createVideo();
}

实现接口,用来给工厂返回创建了的对象

public class JavaNote implements INote{
    @Override
    public void edit() {
        System.out.println("编写java笔记");
    }
}

public class JavaVideo implements IVideo{

    @Override
    public void record() {
        System.out.println("录制java视频");
    }
}

最后实现工厂类:

public class JavaCourseFactory implements CourseFactory{
    @Override
    public INote createNote() {
        return new JavaNote();
    }

    @Override
    public IVideo createVideo() {
        return new JavaVideo();
    }
}

优缺点:规定了所有可能被创建的产品集合,产品族中拓展新产品比较困难,需要修改抽象工厂的接口。

ref:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dlage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值