面试装X之--工厂模式

工厂模式

是创建对象的最佳方式, 属于创建型方式,在工厂模式中,我们在创建对象的时候不是向客户端暴露创建逻辑,
并且是通过一个共同的接口指向创建的对象.

示例:
这里我们使用课程来做示例,课程里面包含课程视频(Icourse),课程笔记(INode)…,拥有不同课程(java,python…)实现这个接口.

  • ICourse & INode :
public interface INote {
    public void create();
}
public interface INote {
    public void create();
}

  • 不同的课程实现这些接口
public class JavaCourse implements ICourse ,INote{
    public void record() {
        System.out.println("录制java课程");
    }

    public void create() {
        System.out.println("创建Java笔记");
    }
}

一.简单工厂模式(Simple Factory pattern)

是指由一个工厂对象决定创建出哪一种产品类的实例.
示例 :
简单工厂 : 最开始可以传入要创建的课程名
工厂代码 :

public class CourseFactory {
public ICourse create(String name){
	if("java".equals(name)){
	return new JavaCourse();
	}else if("python".equals(name)){
	return new PythonCourse();
	}else {
	return null;
		}
	}
}

调用代码 :

  public static void main(String[] args) {
        CourseFactory courseFactory = new CourseFactory();
        ICourse course = courseFactory.create("Java");
        course.record();
    }

上面的工厂代码中,对比普通的new出一个JavaCourse,屏蔽了创建的细节,只需要传入一个 "Java"就行了,但是这样的简单工厂有一个问题,就是随着业务的扩展,比如新来个python课程,就需要对工厂中的代码进行修改,不符合开闭原则.

如何优化?

我们可以利用反射技术进行优化
类图 :
在这里插入图片描述

public class CourseFactory {
    public ICourse create(Class clazz) {
        try {
            if (null != clazz) {
                return (ICourse) clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
 public static void main(String[] args) {
        CourseFactory courseFactory = new CourseFactory();
        ICourse course = courseFactory.create(JavaCourse.class);
        course.record();
    }

这样就能很好的避免频繁修改代码了.

二. 工厂方法模式(Factory Method Pattern)

是指定义一个创建对象的接口,但是让实现这个接口的类决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行.
类图:
在这里插入图片描述
工厂接口 :

interface IcoursepFactory {
     ICourse course() ;
}

不同工厂实现这个接口 :

public class JavaCourseFactory implements IcoursepFactory {
    public ICourse course() {
        return new JavaCourse();
    }
}

测试代码 : 通过创建不同的工厂来创建不同的对象

  public static void main(String[] args) {
        IcoursepFactory factory = new JavaCourseFactory();
        ICourse course = factory.course();
        course.record();
    }

工厂模式目前看起来就是一个工厂只能生产出一种产品,你需要那种产品只需要创建出专门生产该产品的工厂就行了

三.抽象工厂方法(Abstract Factory Method)

是指创建一系列相关或者相互依赖的对象的接口,无需指定它们具体的类.简单来说,就是一个工厂可以产出多个产品,这些产品的集合也是被抽象出来的,这些同系列产品也能被其他的工厂创建.
示例: 课程包含: 录屏,笔记… ,而且拥有不同的课程都能拥有这些东西.
课程内容的集合 :

//要求所有的子工厂都实现这个接口中的所有方法
public interface ICourseFactory {
    ICourse createCourse();

    INote createINote();

    IVideo createVidio();
}

java课程的子工厂:

public class JavaCourseFactory implements ICourseFactory {

    public ICourse createCourse() {
        return new JavaCourse();
    }

    public INote createINote() {
        return new JavaINote();
    }

    public IVideo createVidio() {
        return new JavaVideo();
    }
}

java课程内容具体实现 :

public class JavaINote implements INote {
    public void create() {
        System.out.println("java笔记");
    }
}
public class JavaVideo implements IVideo {
    public void create() {
        System.out.println("Java 视频");
    }
}

这种工厂方法,规定了所有 可能被创建的方法的集合,产品中扩展新的产品困难,需要修该抽象工厂的接口.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值