文章目录

1.简单模式

1.1.概念

简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例。
属于创建型模式,但它不属于GOF,23种设计模式

1.2.适用场景

工厂类负责创建的对象较少。
客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

1.3.案例说明

/**
*
* @Description:TODO
* @Author:gaoxinfu
* @Time:2019年3月9日 下午6:47:05
*/
public interface ICourse {
void record();
}

/**
*
* @Description:TODO
* @Author:gaoxinfu
* @Time:2019年3月9日 下午6:47:53
*/
public class JavaCourse implements ICourse {

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

客户端调用

public class SimpleFactoryTest {
public static void main(String[] args) {
ICourse course = new JavaCourse();
course.record();
//如果其他的课程,则用下面,显然这样太繁琐了;
//ICourse course = new VbCourse();
//course.record();
//其他课程.....
}
}

改造1

//新增一个
public class CourseFactory {
public ICourse create(String name){
if("java".equals(name)){
return new JavaCourse();
}else if("python".equals(name)){
return new PythonCourse();
}else {
return null;
}
}
}
// 然后我们通过工厂去调用
public class SimpleFactoryTest {
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
ICourse course = factory.create("java");//这样传递,有可能会传递不存在参数,见改造2
course.record();
}
}

改造2 适用反射机制优化

public class CourseFactory {
public ICourse create(String className){
try {
if (!(null == className || "".equals(className))) {
return (ICourse) Class.forName(className).newInstance();//适用反射去优化
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}

//调用
public class SimpleFactoryTest {

public static void main(String[] args) {

// ICourse course = new JavaCourse();
// course.record();

ICourseFactory factory = new ICourseFactory();
ICourse course = factory.create("com.gupaoedu.vip.pattern.factory.JavaCourse");//参数太长,还是有可能传错,见改造3
course.record();
}
}

改造3

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 class SimpleFactoryTest {

public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
ICourse course = factory.create(JavaCourse.class);
course.record();
}
}

1.4.优点

只需传入一个正确的参数,就可以获取你所需要的对象无须知道其创建的细节。

1.5.缺点

1.工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则。
2.不易于扩展过于复杂的产品结构。

2.源码案例

2.1.Calendar 时间

public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}
public static Calendar getInstance(TimeZone zone)
{
return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
}
根据不同的时区和语言,创建时间

2.2.LoggerFactory 工厂日志

public static Logger getLogger(String name) {
ILoggerFactory iLoggerFactory = getILoggerFactory();
//这里简单工厂模式
return iLoggerFactory.getLogger(name);
}

工厂模式之简单模式_java

2.3.ApplicationContext :spring容器

工厂模式之简单模式_ico_02

工厂模式之简单模式_工厂类_03