1、模式定义
工厂模式(Factory Pattern)提供了一种创建对象的方式,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,属于创建型模式。
2、模式解决的问题
提供一个统一的创建对象的方法,客户端不用关心对象是怎么创建的,工厂可以根据不同的情况,可以每一次都返回同一个对象(单例),也可以每次都返回一个新的对象(多例),单例的情况居多,比如获取连接池对象。
3、模式角色
工厂(Factory):工厂主要作用,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
4、代码实现
代码语言:javascript复制/** * Created by zengjianlu on 2018/2/23. * @author zengjianlu */public interface Fruit { /** * 获取颜色 * @return */ String getColor();}
代码语言:javascript复制/** * Created by zengjianlu on 2018/2/23. * @author zengjianlu */public class Orange implements Fruit{ @Override public String getColor() { return "yellow"; }
代码语言:javascript复制/** * @author zengjianlu */public class Apple implements Fruit {
@Override public String getColor() { return "red"; }}
代码语言:javascript复制/** * Created by zengjianlu on 2018/2/23. * * 缺点违反开闭原则,增加新的水果需要修改静态工厂方法 * * @author zengjianlu */public class FruitFactory {
private final static String APPLE = "apple";
private final static String ORANGE = "orange";
private final static Fruit APPLE_FRUIT = new Apple();
private final static Fruit ORANGE_FRUIT = new Orange();
public static Fruit getFruitInstance(String fruitName){ if(APPLE.equals(fruitName)){ return APPLE_FRUIT; }else if (ORANGE.equals(fruitName)){ return ORANGE_FRUIT; }else { return APPLE_FRUIT; }
}
}
代码语言:javascript复制/** * @author zengjianlu * @date 2019/5/19 */public class Test { public static void main(String[] args) { Fruit orange = FruitFactory.getFruitInstance("orange"); System.out.println("orange color :" orange.getColor()); Fruit apple = FruitFactory.getFruitInstance("apple"); System.out.println("apple color :" apple.getColor()); }}
5、运行结果
6、优缺点分析
优点:
一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一种产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度。违背了开闭原则,如果有新的产品,需要修改工厂类。