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