码迷,mamicode.com
首页 > 其他好文 > 详细

接口和工厂设计模式

时间:2018-08-12 23:40:18      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:获取对象   top   head   mysql   测试   目的   需要   mic   padding   

接口又是怎么一回事呢 ?接口就是一组规范 ,是在定义一种标准 。这说起来真的挺别扭的 ,我是这么理解的 ,当我们的抽象类全是抽象方法时 ,我们就可以定义接口了 ,那为什么不能继续用抽象类来表示而要定义一个接口呢 ?由于 Java 本身有单继承的局限 ,而接口是可以多实现的 。所以我就额外定义一个 interface 来表示哪些全是抽象方法的类 。相比于抽象类 ,我们可以感受出 Java 设计的初衷 ,抽象类是作为模板使用 ,对部分方法进行抽象 ,而接口更多的是对行为或是方法的抽象 。

那接口用什么用呢 ?接口的定义简单且规范 ,因为不用实现具体的方法 ,而所有的实现类都要实现接口中的方法 。易扩展 ,我们定义一套接口 ,可以使用不同的方式来实现它 ,在使用的时候只需调用不同的实现类即可 。还有安全 ,说个最常见的例子 ,我们在 DAO 层定义对数据的 CRUD 操作时 ,就可以使用接口来定义 ,具体的实现可能针对的是 MySQL ,Oracle ,SQL server 。当写业务代码的同学调用 DAO 层方法的时候 ,不需要知道也不知道底层操作的是什么数据库 。

之前好像忘了说了 ,设计模式就是一些开发思路和模式的总结 ,说白了就是套路 ,就像遇上感冒你上来就说 “ 多喝开水 ” 一样 ,不同的设计模式对应不同的业务场景 ,那下面就来看一看工厂设计模式 。

在工厂模式中 ,我们在创建对象时不会对客户端暴露创建逻辑 ,并且是通过使用一个共同的接口( Car )来指向新创建的对象 。这就是一种创建类的方法 。主要体现在工厂中获取对象的方法的内部逻辑 。像下面示例中的 getCar 方法 。

public interface Car {
    void run();
}

public class BaoMa implements Car{

    @Override
    public void run() {
        System.out.println("我在 BaoMa 里笑。");
    }

}

public class BigCar implements Car{

    @Override
    public void run() {
        System.out.println("我是 BigCar ,我不怕撞!");
    }

}

public class SmallCar implements Car {

    @Override
    public void run() {
        System.out.println("我是 SmallCar ,看起来精致!");
    }

}

/**
 * 工厂决定以何种形式创建对象,为什么叫工厂,也就是因为,对象如何产生是在这里决定的。
 *
 */
public class CarFactory {

    // 这是重点呀,返回的都是同一个接口。这也是多态的体现 向上转型。
    public Car getCar(String type){
          if(type == null){
             return null;
          }        
          if(type.equalsIgnoreCase("SMALLCAR")){
             return new SmallCar();
          } else if(type.equalsIgnoreCase("BIGCAR")){
             return new BigCar();
          } else if(type.equalsIgnoreCase("BAOMA")){
             return new BaoMa();
          }
          return null;
       }
}

// 测试类
public class FactoryTest {

    public static void main(String[] args) {

        CarFactory factory = new CarFactory();

        Car car = factory.getCar("smallcar");
        car.run();

        Car car2 = factory.getCar("bigcar");
        car2.run();

        Car car3 = factory.getCar("baoma");
        car3.run();
    }
}

我是 SmallCar ,看起来精致!
我是 BigCar ,我不怕撞!
我在 BaoMa 里笑。

通过上面的实例我们可以看出 ,当我们的实现类很少了的时候 ,我们没必要使用工厂设计模式 ,但是在使用这种模式之后 ,若是需要添加一个新的业务 ,也是比较方便的 ,( 比方说工厂中又添加了 SuperCar )添加一个实现类即可 ,当然还有 getCar 中的逻辑 ,就达到了扩展的目的 ,而调用人员无需关注这些 。

已经说完了抽象类和接口 ,那么就来总结一下它们两个的不同 。

 抽象类接口
定义 包含一个抽象方法的类 抽象方法和常量的集合
组成 构造方法,抽象方法,普通方法,常量 变量 常量 抽象方法
使用 子类继承抽象类 子类实现接口
关系 抽象类可以实现多个接口 接口不能继承抽象类,但允许继承多个接口
设计模式 模板设计模式 工厂设计模式,代理设计模式
实际 作为一种模板 是作为一个标准或表示一种能力
局限 单继承 可以多继承
实例化 不能 不能

 

接口和工厂设计模式

标签:获取对象   top   head   mysql   测试   目的   需要   mic   padding   

原文地址:https://www.cnblogs.com/YJK923/p/9465408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!