设计模式-工厂方法模式

一、工厂方法模式(创建型模式)
1.定义
工厂方法模式(Factory Method Pattern)是定义一个创建产品(即java中的对象)的工厂接口,将具体的产品创建延迟到子类(具体工厂)来创建,用户不需要知道产品的具体创建细节,只需要知道产品所对应的工厂类就可以了。
**注:**相较于简单工厂来说,工厂方法模式符合开闭原则,当增加产品时,只需要增加相应的工厂类就可以,不需要修改其他工厂类代码,符合开闭原则。
2.工厂方法模式中的角色
**(1).抽象工厂(AbstractFactory):**提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
**(2).具体工厂(ConcreteFactory):**主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
(**3).抽象产品(Product):**定义了产品的规范,描述了产品的主要特性和功能。
**(4).具体产品(ConcreteProduct):**实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
3.具体实例
(1).场景:
一个汽车生产厂家,负责生产宝马车和奔驰车,如果用户想要一辆奔驰或者宝马,不可能自己动手造一辆吧,可以通过4s之类的汽车销售平台,而这些销售平台没有造车的能力,他们只需知道客户需要什么样的车,然后告知具体工厂来进行生产就可以了(这里就是用户只需知道相应的工厂类就可以了)。
先来看一下简单工厂模式
(2).简单工厂模式
**注:**工厂方法模式是对简单工厂模式的优化,如果当产品较少,可以直接使用简单工厂模式,多了的话维护困难,增加产品时要修改工厂源码,那就使用工厂方法模式,符合开闭原则。
代码示例:

package com.tw.designPattern.factory.factoryMethod;

/**
 * 抽象角色 汽车
 */
public interface Car {

    void run();
}
package com.tw.designPattern.factory.factoryMethod;

/**
 * 具体角色 宝马车
 */
public class BMWCar implements Car{

    @Override
    public void run() {
        System.out.println("宝马车行驶中...");
    }
}

package com.tw.designPattern.factory.factoryMethod;

/**
 * 具体角色 奔驰车
 */
public class BenzCar implements Car{

    @Override
    public void run() {
        System.out.println("奔驰车行驶中...");
    }
}
package com.tw.designPattern.factory.factoryMethod;

public class SimpleCarFactory {

    /**
     * 根据参数name判断具体生产那种类型的车
     * @param name
     * @return
     */
    Car productCar(String name) {

        if ("BMW".equals(name)) {
            return new BMWCar();
        } else if ("BENZ".equals(name)) {
            return new BenzCar();
        }
        return null;
    }
}

package com.tw.designPattern.factory.factoryMethod;

public class SimpleFactoryTest {

    public static void main(String[] args) {
        // 创建普通工厂实例
        SimpleCarFactory simpleCarFactory = new SimpleCarFactory();
        // 生产宝马车
        Car bmwCar = simpleCarFactory.productCar("BMW");
        // 宝马车行驶中
        bmwCar.run();
        // 生产奔驰车
        Car benzCar = simpleCarFactory.productCar("BENZ");
        // 奔驰车行驶中
        benzCar.run();
    }
}

测试结果:

宝马车行驶中...
奔驰车行驶中...

如果工厂现在又要生产大众汽车了,这是就需要修改SimpleCarFactory中的productCar(String name)方法,这样就违背了开闭原则,所以就有了工厂方法模式来优化简单工厂模式。
(3).工厂方法模式

package com.tw.designPattern.factory.factoryMethod;

/**
 * 抽象角色 汽车
 */
public interface Car {

    void run();
}
package com.tw.designPattern.factory.factoryMethod;

/**
 * 具体角色 宝马车
 */
public class BMWCar implements Car{

    @Override
    public void run() {
        System.out.println("宝马车行驶中...");
    }
}

package com.tw.designPattern.factory.factoryMethod;

/**
 * 具体角色 奔驰车
 */
public class BenzCar implements Car{

    @Override
    public void run() {
        System.out.println("奔驰车行驶中...");
    }
}

package com.tw.designPattern.factory.factoryMethod;

/**
 * 抽象工厂 汽车生产工厂
 */
public interface CarFactory {

    Car productCar();
}

package com.tw.designPattern.factory.factoryMethod;

/**
 * 具体工厂 宝马车工厂
 * 只负责生产宝马车
 */
public class BMWFactory implements CarFactory{

    @Override
    public Car productCar() {
        return new BMWCar();
    }
}

package com.tw.designPattern.factory.factoryMethod;

/**
 * 具体工厂 奔驰车工厂
 * 只负责生产奔驰车
 */
public class BenzFactory implements CarFactory{

    @Override
    public Car productCar() {
        return new BenzCar();
    }
}

package com.tw.designPattern.factory.factoryMethod;


public class CarFactoryTest {

    public static void main(String[] args) {
        // 宝马车工厂
        BMWFactory bmwFactory = new BMWFactory();
        // 生产宝马车
        Car bmwCar = bmwFactory.productCar();
        // 宝马车行驶中
        bmwCar.run();
        // 奔驰车工厂
        BenzFactory benzFactory = new BenzFactory();
        // 生产奔驰车
        Car benzCar = benzFactory.productCar();
        // 奔驰车行驶中
        benzCar.run();
    }
}

测试结果:

宝马车行驶中...
奔驰车行驶中...

使用工厂方法模式的话,当需要增加生产种车型时,只需要实现CarFactory工厂接口,重写productCar()方法,不会修改其他源码,符合开闭原则。
下面会列举一下工厂方法的优缺点和实际应用场景。
4.优缺点
(1).优点:
(1-1).工厂方法模式创建用户所需的产品时,用户无需关心产品的创建细节,只需知道创建的产品所对应的工厂。
(1-2).当增加新的产品时,只需增加相应的具体工厂和具体产品,无需修改其他工厂源码和其他产品源码,利于扩展,符合开闭原则。
(2).缺点:
(2-1).当增加新的产品时,需增加相应的具体工厂和具体产品,这样会导致类的个数过多,增加系统复杂度,这是它的缺点从扩展方面也是它的优点(类个数过多,系统复杂度增加,我感觉这是设计模式的通病)。
5.应用场景
(1).当创建一个产品时,需要很多代码细节而用户又不需要知道这些细节时,可以使用工厂方法模式。
(2).用户只知道工厂名(如买东西时只知道具体的品牌时),不知道具体产品。
6.附上代码图片方便手机端查看
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:内容参考网络上各种资料,还有一些本人的理解和思想,仅为了学习记录和分享一下自己所学之处,如有不足的地方麻烦大牛指出,如有侵权的地方,请联系删除,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值