设计模式二之工厂模式

一、工厂模式  

  工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

优点:

  • 一个调用者想创建一个对象,只要知道其名称就可以了,降低了耦合度。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。使得代码结构更加清晰。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

1.1、简单工厂模式

        实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例,这个比较简单例子就不写了。但是简单工厂模式不符合开闭原则。

1.2、工厂方法模式

        工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。 提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。对扩展友好,无需修改原有的代码。但是也新增了好多的文件,从理论上讲,工厂方法模式有优势,从实际上讲,还是使用简单工厂模式占优势,可见没有绝对的好坏。

  交通工具类接口

package com.duchong.factorymodel;

/**
 * Created by DUCHONG on 2018/3/29.
 */
public interface Car {

     void move();
}

  具体的交通工具实现类

package com.duchong.factorymodel;

/**
 * @author DUCHONG
 * @since 2018-03-29 14:05
 **/
public class Bus implements Car{
    @Override
    public void move() {
        System.out.println("Bus move slowly");
    }
}
package com.duchong.factorymodel;

/**
 * @author DUCHONG
 * @since 2018-03-29 14:06
 **/
public class Taxi implements Car{
    @Override
    public void move() {
        System.out.println("Taxi move faster");
    }
}

  交通工具的工厂类接口

package com.duchong.factorymodel;

/**
 * Created by DUCHONG on 2018/3/29.
 */
public interface CarFactory {

    Car getCar();
}

  具体的交通工具工厂类的实现类

package com.duchong.factorymodel;

/**
 * @author DUCHONG
 * @since 2018-03-29 14:08
 **/
public class BusFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Bus();
    }
}
package com.duchong.factorymodel;

/**
 * @author DUCHONG
 * @since 2018-03-29 14:09
 **/
public class TaxiFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Taxi();
    }
}

  调用者,这里用main方法代替

package com.duchong.factorymodel;

/**
 * @author DUCHONG
 * @since 2018-03-29 14:09
 **/
public class Main {
    public static void main(String[] args) {
        CarFactory factory=null;

        factory=new BusFactory();
        Car bus=factory.getCar();
        bus.move();

        factory=new TaxiFactory();
        Car taxi=factory.getCar();
        taxi.move();
    }
}

  运行结果

 

posted @ 2018-03-29 14:29  npe0  阅读(207)  评论(0编辑  收藏  举报