工厂模式

1.简单工厂

1.1 定义

指由一个工厂对象决定创建出哪一种产品类的实例,但是不属于GOF 23种设计模式,简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

1.2优缺点

优点:模块清晰,分工明确,可维护性、可读性高
缺点:每新增一类产品都要新增实现类,随着产品的增多这样会越来越臃肿,另外工厂类的职责过重,不易于扩展复杂的产品结构。

1.3demo

/**
 * create by yufeng on 2021/7/3 17:00
 */
public interface ICourse {
    /**
     * 录制视频
     * @return
     */
    void record();
}
/**
 * create by yufeng on 2021/7/3 17:00
 */
public class JavaCourse implements ICourse {

    public void record() {
        System.out.println("录制Java课程");
    }
}

/**
 * create by yufeng on 2021/7/3 17:00
 */
public class CourseFactory {

    public ICourse create(Class clazz){
        try {
            if (null != clazz) {
                return clazz.newInstance();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

}
/**
 * 简单工厂 小作坊式的工厂模型
 * create by yufeng on 2021/7/3 17:00
 */
public class SimpleFactoryTest {

    public static void main(String[] args) {

        CourseFactory factory = new CourseFactory();
        ICourse course = factory.create(JavaCourse.class);
        course.record();

    }

这样以后不管新增审课程只需要创建一个ICourse 的是实现类,然后通过factory.create(class)就ok,类图如下:


简单工厂

2.工厂方法

2.1 定义

工厂方法模式是指定义一个创建对象的接口,但是让实现类去完成对象的创建,让类的创建推迟到子类的实现中,用户只需要弄清楚产品对应的工厂,不需要关心创建的细节,新增的工厂符合开闭原则,(也符合单一职责简单工厂貌似违背了单一职责)

适用场景:
创建对象需要大量重复代码时
客户端不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来创建哪个对象

2.2 优缺点

优点:
当创建对象需要大量重复代码时可以避免
相对于简单工厂模式符合开闭原则,提高了系统的可扩展性
缺点:
类的数量容易过多,增加复杂度
增加了系统的抽象性和理解难度

2.3demo

/**
 * create by yufeng on 2021/7/3 20:00
 */
public interface ICourse {
    /**
     * 录制视频
     * @return
     */
    void record();
}

/**
 * create by yufeng on 2021/7/3 20:00
 */
public class JavaCourse implements ICourse {

    public void record() {
        System.out.println("录制Java课程");
    }
}
/**
 * create by yufeng on 2021/7/3 20:00
 */
public class PythonCourse implements ICourse {

    public void record() {
        System.out.println("录制Python课程");
    }
}

/**
 * create by yufeng on 2021/7/3 20:00
 */
public class JavaCourseFactory implements ICourseFactory {
    public ICourse create() {
        return new JavaCourse();
    }
}
/**
 * create by yufeng on 2021/7/3 20:00
 */
public class PythonCourseFactory implements ICourseFactory {

    public ICourse create() {
        return new PythonCourse();
    }
}

/**
 * create by yufeng on 2021/7/3 20:00
 */
public class FactoryMethodTest {

    public static void main(String[] args) {

        ICourseFactory factory = new PythonCourseFactory();
        ICourse course = factory.create();
        course.record();

        factory = new JavaCourseFactory();
        course = factory.create();
        course.record();

    }

}

执行结果:
    录制Python课程
        录制Java课程

类图如下:


工厂方法.png

3.抽象工厂

3.1 定义

抽象工厂模式是指提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类,客户端不依赖于产品类实例如何被创建、实现等细节,强调的是一系列产品的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码,需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

抽象工厂感觉就是一个实体实例化要做很多事情,比如课程,既要做笔记又要看视频,单项笔记、看视频是相当于产品等级结构,同一课程的视频和笔记是属于同一个产品族,抽象工厂就是把这个产品族实例化的过程抽象出来,具体的工厂实现中进行实现

3.2 优缺点

我们从源码中(下面提供)也可以看到,这个抽象工厂把等级结构都很好的阐释了出来,同时也有缺点,当新增产品等级的时候,我们这个时候就要修改抽象工厂了,违背了开闭原则
缺点:
    1.产品族中新增产品困难,需要修改抽象工厂,违背开闭原则
    2.增加了系统的抽象程度和理解难度
有点:
    1.出了工厂方法的优点外
    2.在类的内部对产品族进行了约束

3.3 demo

抽象工厂源码地址

你可能感兴趣的:(工厂模式)