java设计模式之工厂模式

2019-05-28 20:36:45 浏览数 (1)

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、优缺点分析

优点:

一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

每次增加一种产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度。违背了开闭原则,如果有新的产品,需要修改工厂类。

0 人点赞