设计模式学习之简单工厂

126 阅读1分钟

前言

通过记录的方式对所学知识做一个记录,加深印象,巩固记忆。仅此而已。

定义

由一个工厂对象决定创建出哪一种产品类的实例。

使用场景

1.工厂类创建的实例比较少。
2.在创建对象之前不需要关心内部实现,应用层只需传入所需要创建产品的参数即可。

优点

只需要传入所需要的参数便可创建所需对象,无需关心内部逻辑具体实现。

缺点

工厂类的职责相对过重,再需要添加新产品时,需要去修改工厂类的内部判断逻辑,违背了开闭原则。

UML类图

vedio 类

public abstract class Vedio {
    public abstract void produce();
}

JavaVedio 类

public class JavaVedio extends Vedio{
    @Override
    public void produce() {
        System.out.println("java相关课程");
    }
}

PythonVedio 类

public class PythonVedio extends Vedio{
    @Override
    public void produce() {
        System.out.println("python相关课程");
    }
}

SimpleFactory

public class SimpleFactory {
//    public Vedio getVedio(String type){
//        if("java".equals(type)){
//            return new JavaVedio();
//        }else if("python".equals(type)){
//            return new PythonVedio();
//        }
//        return null;
//    }
    // 利用类的反射机制
    public Vedio getVedio(Class c){
        Vedio vedio = null;
        try {
            vedio = (Vedio) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return vedio;
    }
}

测试类

    public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
//        Vedio java = simpleFactory.getVedio("python");
//        simpleFactory.getVedio("python");
//        java.produce();
        Vedio vedio = simpleFactory.getVedio(PythonVedio.class);
        vedio.produce();
    }
}

Calendar.java(jdk源码解析)

getInstance()