java设计模式(一)工厂模式 1.简单工厂模式

工厂模式 简单的来说就 我们需要的对象不由我们手动new出来,而是使用工厂对象加工出来.

而工厂模式又分为 简单工厂 工厂方法 抽象工厂等多种类型 本章主要通过例子讲解简单工厂模式

简单工厂模式指的是 由一个工厂对象决定创建哪一种产品类的实例.
简单工厂模式适用于工厂类负责创建的对象较少的场景,而且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心.
缺点在于 工厂类的职责相对过重 不太易于拓展过于复杂的产品结构.

举个例子

根据实际业务 需要产生两个不同地区的员工对象

没有使用工厂模式的代码 如下

    /**
     * IWorker 是所有地区员工的父接口
     *
     * 深圳员工 武汉员工 都实现 IWorker
     * */
    public static void main(String[] args) {

        // 深圳子公司业务需要生成深圳员工 并工作
        IWorker shenZhen = new ShenZhenWorker();
        shenZhen.work();

        // 武汉子公司业务需要生成武汉员工 并工作
        IWorker wuHan = new WuHanWorker();
        wuHan.work();
    }

如果此时需求更新 武汉员工出差到深圳 子公司业务需要通过员工的籍贯住址生成不同的员工去工作,或者子公司业务需要在生产员工前先签署不同的劳务合同,在那么直接写死在代码中的new ShenZhenWork();就需要修改,如果业务庞大 需要修改的代码有几百处,那这个工作量可想而知的大,此时可以考虑使用工厂模式

下面是简单工厂模式的一个简单实例

public class WorkerFactory {

    public IWorker create(String addr){
        IWorker worker = null;
        if("深圳".equals(addr)){
            worker = new ShenZhenWorker();
            worker.contract("劳务合同");
            return worker;
        }else if("武汉".equals(addr)){
            worker = new WuHanWorker();
            worker.contract("外包合同");
            return worker;
        }
        return worker;
    }
}

 public static void main(String[] args) {
        // 简单工厂模式
        ReportWorkerFactory factory = new ReportWorkerFactory();
        factory.create("深圳").work();
        factory.create("武汉").work();
}

此时子公司就可以通过 员工工厂生产出对应的员工(工厂根据实际条件生产不同的对象),
以及签署不同的合同(在生产对象时对对象进行初始化定制化)

此时的工厂也是一个对象 需要new出来,根据实际业务,可以将工厂转变为静态工厂

public class WorkerFactory {

    public static IWorker create(String addr){
        IWorker worker = null;
        if("深圳".equals(addr)){
            worker = new ShenZhenWorker();
            worker.contract("劳务合同");
            return worker;
        }else if("武汉".equals(addr)){
            worker = new WuHanWorker();
            worker.contract("外包合同");
            return worker;
        }
        return worker;
    }
}

 public static void main(String[] args) {
        // 静态工厂模式
        ReportWorkerFactory.create("深圳").work();
        ReportWorkerFactory.create("武汉").work();
}

但是此时如果我们业务继续拓展,新成立了一个广州分公司.那么工厂中的create方法就要每次根据业务的拓展不断增加与修改代码的逻辑,不符合代码开闭原则.因此我们还可以对简单工厂进行改造优化,采用反射技术.
这样优化之后,业务的不断拓展的过程中不需要修改WorkerFactory中的代码

public class WorkerFactory {

    public static IWorker create(Class<? extends IWorker> clazz){
       try {
            if(null != clazz){
                clazz.newInstance();
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
        return null;
}

 public static void main(String[] args) {
        // 静态工厂模式
        ReportWorkerFactory.create(ShenZhenWorker.class).work();
        ReportWorkerFactory.create(WuHanWorker.class).work();
}

此时查看一下具体的类图 如下


类关系图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。