2.设计模式-工厂模式(创建型)

资料:https://gitee.com/chuanqi1995/java

如果没有工厂模式我们写的代码

场景

现在有一个课程,里面有Python、Java、Go语言等课程,并且每个课程都有以下业务

  1. 观看
  2. 录播
package start.service;

public interface CourseService {
    // 观看
    void view();
    // 录屏
    void record();
}
package start.service.impl;

import start.service.CourseService;

public class JavaCourseServiceImpl implements CourseService
{
    @Override
    public void view() {
        System.out.println("观看Java");
    }

    @Override
    public void record() {
        System.out.println("录屏Java");
    }
}
package start.service.impl;

import start.service.CourseService;

public class PythonCourseServiceImpl implements CourseService {
    @Override
    public void view() {
        System.out.println("观看Python");
    }

    @Override
    public void record() {
        System.out.println("录屏Python");
    }
}
package start;

import start.service.CourseService;
import start.service.impl.JavaCourseServiceImpl;
import start.service.impl.PythonCourseServiceImpl;

public class Test {
    public static void main(String[] args) {
        // Java、Python、Go
        // 他们都有这些业务:可以观看、可以录屏

        CourseService courseService = new JavaCourseServiceImpl();
        courseService.view();
        courseService.record();

        CourseService courseService2 = new PythonCourseServiceImpl();
        courseService2.view();
        courseService2.record();
    }
}

如果后面课程业务加了很多个课程,比如Go、C#,他们都属于课程,但是每次都要new一次对象,我们可不可以用什么方式给管理起来呢?这个时候工厂模式出现了!

简单工厂

package simple.service;

public interface CourseService {
    // 观看
    void view();
    // 录屏
    void record();
}
package simple.service.impl;

import simple.service.CourseService;

public class PythonCourseServiceImpl implements CourseService {
    @Override
    public void view() {
        System.out.println("观看Python");
    }

    @Override
    public void record() {
        System.out.println("录屏Python");
    }
}
package simple.service.impl;

import simple.service.CourseService;

public class JavaCourseServiceImpl implements CourseService
{
    @Override
    public void view() {
        System.out.println("观看Java");
    }

    @Override
    public void record() {
        System.out.println("录屏Java");
    }
}
package simple.factory;

import simple.service.CourseService;
import simple.service.impl.GoCourseServiceImpl;
import simple.service.impl.JavaCourseServiceImpl;
import simple.service.impl.PythonCourseServiceImpl;

public class CourseServiceFactory {
    public static CourseService get(String name){
        if("Java".equals(name)){
            return new JavaCourseServiceImpl();
        }else if("Python".equals(name)){
            return new PythonCourseServiceImpl();
        }else if("Go".equals(name)){
            return new GoCourseServiceImpl();
        }
        return null;
    }
}
package simple.factory;

import simple.service.CourseService;

public class Test {
    public static void main(String[] args) {
        CourseService courseService = CourseServiceFactory.get("Go");
        courseService.record();
        courseService.view();
    }
}

虽然用简单工厂管理起来了,但是也有缺点,缺点就是每次加课程,都需要在CourseServiceFactory里添加大量的逻辑代码,所以工厂方法模式出现了!

工厂方法

package function.service;

public interface CourseService {
    // 观看
    void view();
    // 录屏
    void record();
    // 编写笔记
    void edit();
    // 下载笔记
    void download();
}
package function.service.impl;

import function.service.CourseService;

public class PythonCourseServiceImpl implements CourseService {
    @Override
    public void view() {
        System.out.println("观看Python");
    }

    @Override
    public void record() {
        System.out.println("录屏Python");
    }

    @Override
    public void edit() {

    }

    @Override
    public void download() {

    }
}
package function.service.impl;

import function.service.CourseService;

public class JavaCourseServiceImpl implements CourseService
{
    @Override
    public void view() {
        System.out.println("观看Java");
    }

    @Override
    public void record() {
        System.out.println("录屏Java");
    }

    @Override
    public void edit() {

    }

    @Override
    public void download() {

    }
}
package function.service.impl;

import function.service.CourseService;

public class GoCourseServiceImpl implements CourseService
{
    @Override
    public void view() {
        System.out.println("观看Go");
    }

    @Override
    public void record() {
        System.out.println("录屏Go");
    }

    @Override
    public void edit() {

    }

    @Override
    public void download() {

    }
}
package function.factory;

import function.service.CourseService;

public interface CourseServiceFactory {
    CourseService create();
}
package function.factory;

import function.service.CourseService;
import function.service.impl.GoCourseServiceImpl;

public class GoCourseServiceFactory implements CourseServiceFactory{
    @Override
    public CourseService create() {
        return new GoCourseServiceImpl();
    }
}
package function.factory;

import function.service.CourseService;
import function.service.impl.JavaCourseServiceImpl;

public class JavaCourseServiceFactory implements CourseServiceFactory{
    @Override
    public CourseService create() {
        return new JavaCourseServiceImpl();
    }
}
package function.factory;

import function.service.CourseService;
import function.service.impl.PythonCourseServiceImpl;

public class PythonCourseServiceFactory implements CourseServiceFactory{
    @Override
    public CourseService create() {
        return new PythonCourseServiceImpl();
    }
}
package function.factory;

import function.service.CourseService;

public class Test {
    public static void main(String[] args) {
        CourseServiceFactory courseServiceFactory = new JavaCourseServiceFactory();
        CourseService courseService = courseServiceFactory.create();
        courseService.record();
        courseService.view();

        // Java、Python、Go
        // 他们都有这些业务:可以观看、可以录屏、编写笔记、下载笔记
    }
}

虽然每个课程都用不同的工厂去进行创建,但是他也有缺点,就是每个课程有可能有不同的业务,比如新增了编写笔记、下载笔记等等,我们都需要去进行每个课程的方法实现。并且呢,如果课程多,我们也需要创建大量的Java类,创建好多个课程共产类,越来越负责,所以这个时候抽象工厂出现了!

抽象工厂

我们给观看、录屏分组,分为视频组。编写笔记和下载笔记分为笔记组

package abstracts.service;

public interface VideoCourseService {
    // 观看
    void view();
    // 录屏
    void record();
}
package abstracts.service;

public interface NoteCourseService {
    // 编写笔记
    void edit();
    // 下载笔记
    void download();
}
package abstracts.service.Impl;

import abstracts.service.VideoCourseService;

public class PythonVideoCourseServiceImpl implements VideoCourseService
{
    @Override
    public void view() {
        System.out.println("观看Python");
    }

    @Override
    public void record() {
        System.out.println("录制Python");
    }
}
package abstracts.service.Impl;

import abstracts.service.NoteCourseService;

public class PythonNoteCourseServiceImpl implements NoteCourseService
{
    @Override
    public void edit() {
        System.out.println("编写Python笔记");
    }

    @Override
    public void download() {
        System.out.println("下载Python笔记");
    }
}
package abstracts.service.Impl;

import abstracts.service.VideoCourseService;

public class JavaVideoCourseServiceImpl implements VideoCourseService
{
    @Override
    public void view() {
        System.out.println("观看Java");
    }

    @Override
    public void record() {
        System.out.println("录制Java");
    }
}
package abstracts.service.Impl;

import abstracts.service.NoteCourseService;

public class JavaNoteCourseServiceImpl implements NoteCourseService
{
    @Override
    public void edit() {
        System.out.println("编写Java笔记");
    }

    @Override
    public void download() {
        System.out.println("下载Java笔记");
    }
}
package abstracts.factory;

import abstracts.service.NoteCourseService;
import abstracts.service.VideoCourseService;

public abstract class CourseFactory {
    protected abstract NoteCourseService createNoteService();
    protected abstract VideoCourseService createVideoService();
}
package abstracts.factory;

import abstracts.service.Impl.JavaNoteCourseServiceImpl;
import abstracts.service.Impl.JavaVideoCourseServiceImpl;
import abstracts.service.NoteCourseService;
import abstracts.service.VideoCourseService;

public class JavaCourseFactory extends CourseFactory{
    @Override
    protected NoteCourseService createNoteService() {
        return new JavaNoteCourseServiceImpl();
    }

    @Override
    protected VideoCourseService createVideoService() {
        return new JavaVideoCourseServiceImpl();
    }
}
package abstracts.factory;

import abstracts.service.Impl.PythonNoteCourseServiceImpl;
import abstracts.service.Impl.PythonVideoCourseServiceImpl;
import abstracts.service.NoteCourseService;
import abstracts.service.VideoCourseService;

public class PythonCourseFactory extends CourseFactory{
    @Override
    protected NoteCourseService createNoteService() {
        return new PythonNoteCourseServiceImpl();
    }

    @Override
    protected VideoCourseService createVideoService() {
        return new PythonVideoCourseServiceImpl();
    }
}
package abstracts.factory;

import abstracts.factory.JavaCourseFactory;

public class Test {
    public static void main(String[] args) {

        // Java、Python、Go
        // 他们都有这些业务:可以观看、可以录屏、编写笔记、下载笔记
        // 视频:可以观看、可以录屏
        // 笔记:编写笔记、下载笔记

        JavaCourseFactory javaCourseFactory = new JavaCourseFactory();
        javaCourseFactory.createNoteService().edit();
        javaCourseFactory.createVideoService().record();
    }
}
posted @ 2022-03-16 19:29  Java-Legend  阅读(25)  评论(0编辑  收藏  举报