一.简单工厂模式
基本概念:由一个工厂对象决定创建哪一种产品类的实例。简单工厂模式它不属于23种设计模式。
试用场景:适用于工厂类负责创建的对象较少的场景,且客户端只需传入工厂类的参数,对于如何创建对象不需要关心。
缺点:随着产品链的丰富,如果每个课程的创建逻辑有区别,则工厂的职责会变得越来越多,职责相对过重,不易于扩展过于复杂的产品结构。
案例:Calendar
代码实例:
/*创建课程接口*/
public interface ICourse {
void record();
}
/*我是一个java课实例*/
public class JavaCourse implements ICourse {
public void record() {
System.out.println("Java课程");
}
}
/*我是一个python课实例*/
public class PythonCourse implements ICourse {
public void record() {
System.out.println("Python课程");
}
}
/*创建一个课程类工厂,传入需要创建的课程类,返回课程类实体*/
public class CourseFactory {
public ICourse create(Class<? extends ICourse> clazz){
try {
if (null != clazz) {
return clazz.newInstance();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
/*调用*/
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
ICourse course = factory.create(JavaCourse.class);
course.record();
}
注:newInstance()也是用来创建新的对象,其与new()的区别是:newInstance():弱类型,效率低,只能调用无参构造new():强类型,高效率,能调用任何public构造器
二.工厂模式
基本概念:定义一个创建对象的接口,让实现这个接口的类决定实例化那个类,工厂方法模式让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无需关心创建细节,并且加入新的产品时符合开闭原则。
特点:工厂模式不同于简单工厂,将职能拆分,专人干专事。Java课程由Java工厂创建,Python课程由python工厂创建,对工厂本身也做一个抽象。
试用场景:创建对象需要大量重复的代码;客户端(应用层)不依赖于产品类实例如何被创建等细节;一个类通过其子类来指定创建那个类。
缺点:类的个数容易过多,增加复杂度;增加了系统的抽象性和理解难度
/*抽象课程工厂类*/
public interface ICourseFactory {
ICourse create();
}
/*Java课程工厂类*/
public class JavaCourseFactory implements ICourseFactory {
public ICourse create() {
return new JavaCourse();
}
}
/*Python课程工厂类*/
public class PythonCourseFactory implements ICourseFactory {
public ICourse create() {
return new PythonCourse();
}
}
/*调用测试*/
public class FactoryMethodTest {
public static void main(String[] args) {
/*java的调用java的*/
ICourseFactory factory = new PythonCourseFactory();
ICourse course = factory.create();
course.record();
}
}
案例:logback