设计模式之----Java简单工厂模式

设计模式通过特有的模式,帮我们简化我们的代码。工厂模式也不列外。
将从简单工厂模式,到工厂模式,到抽象工厂模式的一个记录。
1.简单的工厂模式:
简单工厂模式实现了生成产品类的代码跟客户端代码分离,在工厂类中你可以添加所需的生成产品的逻辑代码;
课程类的共同接口

public interface ICourse {
    
    
    /**
     * 录制视频
     * @return
     */
    void record();
}

课程A

public class JavaCourse implements ICourse {
    
    

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

课程B

public class PythonCourse implements ICourse {
    
    

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

工厂类

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

测试类:

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

问题来了,优秀的java代码是符合“开放-封闭”原则的,也就是说对扩展开发,对修改关闭,如果你要加一个产品类C,你就要修改工厂类里面的生成产品的代码,在这里你就要增加if-else判断。对于这个问题,我们的工厂方法模式就可以解决这个问题。
2.工厂模式
工厂方法模式中我们把生成产品类的时间延迟,就是通过对应的工厂类来生成对应的产品类,在这里我们就可以实现“开发-封闭”原则,无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。也即,通过子类的子类进行实现具体的方法。
课程工厂模型

public interface ICourseFactory {
    
    

    ICourse create();

}

课程类

public interface ICourse {
    
    
    /**
     * 录制视频
     * @return
     */
    void record();
}

课程A 的工厂

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

课程A的实现

public class JavaCourse implements ICourse {
    
    

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

课程B的工厂

public class PythonCourseFactory implements ICourseFactory {
    
    

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

课程B的实现

public class PythonCourse implements ICourse {
    
    

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

测试类:


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

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

但是这还是有缺点的,如果产品类过多,我们就要生成很多的工厂类。对于这种情况我们可以采用抽象工厂模式。
3.抽象工厂模式
定义一个用户的主入口,便于扩展
课程工厂

public interface CourseFactory {
    
    

    INote createNote();

    IVideo createVideo();

}

笔记接口

public interface INote {
    
    
    void edit();
}

视频接口

public interface IVideo {
    
    
    void record();
}

课程A的工厂

public class JavaCourseFactory implements CourseFactory {
    
    

    public INote createNote() {
    
    
        return new JavaNote();
    }

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

课程A的做笔记的具体实现

public class JavaNote implements INote {
    
    

    public void edit() {
    
    
        System.out.println("编写Java笔记");
    }
}

课程A的视频的具体实现

public class JavaVideo implements IVideo {
    
    
    public void record() {
    
    
        System.out.println("录制Java视频");
    }
}

同理,其他课程的工厂,以及对应工厂的具体的实现如上。
测试类:

 JavaCourseFactory factory = new JavaCourseFactory();

        factory.createNote().edit();
        factory.createVideo().record();

抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。我们在使用中要注意使用抽象工厂模式的条件。
代码地址为:https://github.com/virtuousOne/Design-patterns

Guess you like

Origin blog.csdn.net/qq_35529931/article/details/108700427