工厂模式之简单模式

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);
    }

在这里插入图片描述

2.3.ApplicationContext :spring容器

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u014636209/article/details/88368832
今日推荐