设计模式-java

设计模式之简单工厂(创建型)---1

2019-07-19  本文已影响0人  auzqy

导语

简单工厂又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。如果从设计模式分类的角度应该分在创建型。

定义

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

优缺点

优点

只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道创建细节。

缺点

工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背了开闭原则。

代码示例

example1

使用简单工厂模拟生产奔驰车和宝马车的例子
代码详见 访问链接

UML类图

image.png
/**
 * @Description: 具体的将要生产的 奔驰汽车
 */
public class BenzCar extends Car {
    @Override
    public void produce() {
        System.out.println("一辆 【奔驰】 汽车生产出来了!");
    }
}

/**
 * @Description: 具体的将要生产的 宝马汽车
 */
public class BMWCar extends Car {
    @Override
    public void produce() {
        System.out.println("一辆 【宝马】 汽车生产出来了!");
    }
}

/**
 * @Description: 使用简单工厂设计模式
 */
public class CarFactory {

    /**
     * @Description: 这种方式如果扩展的话,需要增加新的 if/else 的判断
     *              违反了开闭原则
     *
     *              相对对应的解决违反开闭原则的方式可以使用反射,
     *                      如: produceByReflection()
     */
    public Car produce(String carType){
        if("benz".equalsIgnoreCase(carType)){
            System.out.println("一辆 【奔驰】 汽车生产出来了!");
            return new BenzCar();
        } else if ("bmw".equalsIgnoreCase(carType)) {
            System.out.println("一辆 【宝马】 汽车生产出来了!");
            return new BMWCar();
        } else {
            System.out.println("所传车辆类型工厂当前无法建造!");
            return null;
        }
    }

    /**
     * @Description: 通过反射创建对象,一定程度上遵守了开闭原则
     *                          todo 这种通过Class当作如参的方式有待细究
     */
    public static Car produceByReflection(Class calzz){
        try {
            Car car = (Car)Class.forName(calzz.getName()).newInstance();
            return car;
        } catch (InstantiationException e) {
            System.out.println("发生异常," + e);
        } catch (IllegalAccessException e) {
            System.out.println("发生异常," + e);
        } catch (ClassNotFoundException e) {
            System.out.println("发生异常," + e);
        }
        return null;
    }
}

/**
* @Description: 测试类
*/
public class Test {
    public static void main(String[] args) {
        testUseSimpleFactoryAfter();
//        testUseSimpleFactoryAfterByReflection();
    }

    /**
     * @Description: 使用 简单工厂后的调用方法演示
     */
    public static void testUseSimpleFactoryAfter(){
        CarFactory carFactory = new CarFactory();
        carFactory.produce("benz");
        carFactory.produce("bmw");
    }

    /**
     * @Description: 使用 简单工厂后,通过反射创建新的对象
     */
    public static void testUseSimpleFactoryAfterByReflection(){
        Car benzCar = CarFactory.produceByReflection(BenzCar.class);
        benzCar.produce();

        Car bmwCar = CarFactory.produceByReflection(BMWCar.class);
        bmwCar.produce();
    }
}

example2

简易计算器的例子
代码详见 访问链接

UML图

UML类图图示样例

大话设计模式 正文P12

接口示例解释

大话设计模式 正文P13

应用场景

spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

活字印刷术的例子,对可维护,可复用,可扩展,灵活性感觉诠释的很好

大话设计模式 正文P5

相关设计模式 todo

参考

  1. https://coding.imooc.com/learn/list/270.html(强烈推荐)
  2. https://en.wikipedia.org/wiki/Design_Patterns
  3. 大话设计模式,电子版下载链接,https://pan.baidu.com/s/17WOI3Bvp-JUoQXvaomHISg 密码:vw05
    (作者博客,https://www.cnblogs.com/cj723/archive/2007/12/30/1021314.html)
  4. https://www.cnblogs.com/geek6/p/3951677.html
上一篇 下一篇

猜你喜欢

热点阅读