栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式-工厂方法模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式-工厂方法模式

一、工厂方法模式(创建型模式)
1.定义
工厂方法模式是定义一个创建产品(即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 {

    
    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.附上代码图片方便手机端查看






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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995893.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号