接口和工厂设计模式

接口又是怎么一回事呢 ?接口就是一组规范 ,是在定义一种标准 。这提及来真的挺别扭的 ,我是这么理解的 ,当咱们的抽象类全是抽象方法时 ,咱们就能够定义接口了 ,那为何不能继续用抽象类来表示而要定义一个接口呢 ?因为 Java 自己有单继承的局限 ,而接口是能够多实现的 。因此我就额外定义一个 interface 来表示哪些全是抽象方法的类 。相比于抽象类 ,咱们能够感觉出 Java 设计的初衷 ,抽象类是做为模板使用 ,对部分方法进行抽象 ,而接口更多的是对行为或是方法的抽象 。数据库

那接口用什么用呢 ?接口的定义简单且规范 ,由于不用实现具体的方法 ,而全部的实现类都要实现接口中的方法 。易扩展 ,咱们定义一套接口 ,可使用不一样的方式来实现它 ,在使用的时候只需调用不一样的实现类便可 。还有安全 ,说个最多见的例子 ,咱们在 DAO 层定义对数据的 CRUD 操做时 ,就可使用接口来定义 ,具体的实现可能针对的是 MySQL ,Oracle ,SQL server 。当写业务代码的同窗调用 DAO 层方法的时候 ,不须要知道也不知道底层操做的是什么数据库 。设计模式

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

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

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 中的逻辑 ,就达到了扩展的目的 ,而调用人员无需关注这些 。ide

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

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