一、工厂模式
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了,降低了耦合度。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。使得代码结构更加清晰。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
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(); } }
运行结果