Java常用设计模式浅析系列
第一章 简单工厂模式
文章目录
一、简单工厂模式简述
简单工厂模式(SimpleFactory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,但它不属于 GoF 的23种设计模式。
二、适用场景
简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。
Spring 中的BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象,
但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
三、示例代码
1.基础示例
UML图示
代码如下(示例):
ICourse
public interface ICourse {
//录制课程
void record();
}
JavaCourse
public class JavaCourse implements ICourse {
@Override
public void record() {
System.out.println("录制 Java 课程");
}
}
PythonCourse
public class PythonCourse implements ICourse{
@Override
public void record() {
System.out.println("录制 Python 视频");
}
}
CourseFactory
public class CourseFactory {
public ICourse create(String name) {
if ("java".equals(name)) {
//System.out.println("java");
return new JavaCourse();
} else if ("python".equals(name)) {
return new PythonCourse();
} else {
return null;
}
}
}
代码测试
public class SimpleTest {
public static void main(String[] args) {
//父类 ICourse 指向子类 JavaCourse 的引用
//简单工厂对象
CourseFactory factory = new CourseFactory();
//JavaCourse a = (JavaCourse)factory.create("java");
//create 方法创建对象
ICourse a = factory.create("java");
a.record();
ICourse b = factory.create("python");
b.record();
}
}
2.进阶示例
修改CourseFactory
代码如下(示例):
public class CourseFactory {
/*public ICourse create(String name) {
if ("java".equals(name)) {
//System.out.println("java");
return new JavaCourse();
} else if ("python".equals(name)) {
return new PythonCourse();
} else {
return null;
}*/
public static ICourse create(String className) {
if (!(null == className || "".equals(className))) {
try {
return (ICourse) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
对简单工厂模式继续优化,采用反射技术。
CourseFactory2
package com.Design.Simple;
public class CourseFactory2 {
//class 使用类创建对象
public static ICourse create(Class<? extends ICourse> clazz) {
try {
if (clazz != null) {
//newInstance()方法是一个非静态方法,它只能通过类对象访问
//返回一个新的类实例
return clazz.newInstance();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
但还有个问题是,方法参数是字符串,可控性有待提升,而且还需要强制转型。CourseFactory2 在 CourseFactory 基础上修改。
public class SimpleFactoryTest {
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
//工厂类 create JavaCourse 类
//利用反射
ICourse course = factory.create("com.Design.Simple.JavaCourse");
course.record();
//继续优化 使用classname
CourseFactory2 factory2 = new CourseFactory2();
ICourse course2 = factory2.create(PythonCourse.class);
course2.record();
}
}
总结
简单工厂模式也有它的缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。