JAVA设计模式之简单工场模式

场景问题

面向接口编程
接口是系统可插拔的保证,面向接口编程是Java里面一个重要的编程原则,java 程序设计里非常讲究模块的划分,通常有三层 ,逻辑层,表现层和数据层。他们之间都通过接口来通信,这里画一个图表示一下三层结构(如下图1-1)
在这里插入图片描述图1-1
根据上图我们可以得到组件这一个概念,即所谓组件从设计上来讲,是完成一定功能的封装体,不管是一层还是一个模块都是一个被接口隔离的整体,但是这样就引发了我们的一个思考,既然面向接口编程,那么在程序中改如何使用接口

不同模式的解决方案

以前使用接口的方式大致如下图

在这里插入图片描述这里不采用代码说明
但是通过这个类图,我们可以知道客户端调用时候,必须引用具体的实现IMPL,但是其实客户端是不应该知道接口的实现类的,这违背了接口隔离的原则,对于这个,我们这时候就可以使用简单工场来解决问题

解决方案

是什么
简单工场就是提供一个创建对象实例的功能,而不需要关心具体的实现,被创建的类型可以是接口,抽象类,也可以是具体的类
在这里插入图片描述为什么
模块外部是不能知道模块内部的具体实现的,只有模块内部才可以知道具体实现类,但是创建接口是需要实现一个具体的类的
怎么用

  1. 接口的定义
 * 接口定义
 */
public interface Api {
    /**
     * 参数
     * @param s
     */
     void opertion(String s);
}

两个实现类

/**
 * @author 谭婧杰
 * @data 2020/1/12
 * 实现类
 */
public class ApiAImpl implements Api{

    public void opertion(String s) {
        System.out.println("ImplA s=="+s);
    }
}

/**
 * @author 谭婧杰
 * @data 2020/1/12
 */
public class ApiBImpl implements Api {
    public void opertion(String s) {
        System.out.println("ImplB ==="+s);
    }
}

创建工场

/**
 * @author 谭婧杰
 * @data 2020/1/12
 */
public class Factory {
    public static Api createApi(int type){
        Api api = null;
        if(type == 1){
            api = new ApiAImpl();
        } else if (type == 2) {
            api = new ApiBImpl();
        }
        return api;
    }
}

客户端调用

/**
 * @author 谭婧杰
 * @data 2020/1/12
 */
public class Client {
    public static void main(String[] args) {
        Api api = Factory.createApi(1);
        api.opertion("正在使用简单工场模式");
    }
}

结果截图
在这里插入图片描述

模式详解

工场,顾名思义是用来创建东西的,我们程序中的工场就是用来创建接口的,但是也可以用来创建一个抽象类或者普通类的实例
优点

  1. 帮助封装 让组件外部面向接口编程
  2. 解耦 客户端与具体实现类解耦
    缺点
  3. 可能增加客户端的复杂度
  4. 不方便扩展子工场

本质 :

选择实现,简单工场的重点在于选择,实现是已经做好了的,就算实现在简单也要有具体的实现类来实现,而不是在简单工场里实现,简单工场的目的在于为客户端来选择需要的实现,从而实现客户端与实现之间的解耦

发布了34 篇原创文章 · 获赞 19 · 访问量 1477

猜你喜欢

转载自blog.csdn.net/qq_42236003/article/details/103950248