2022-13-Java 设计模式-工厂模式-简单工厂模式

简单工厂模式定义为:简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式结构图:
在这里插入图片描述
简单工厂模式包含如下角色:

            1.Factory(工厂角色)
               工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
            2.Product(抽象产品角色)
              抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
            3.ConcreteProduct(具体产品类)
              具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。

下面通过一个简单的例子实现简单工厂模式。

     题目:使用简单工厂模式模拟宝马工厂(BMWFactory)造车(BMWCar),如果传入参数bmw320,则返回一个BMW320对象,如果传入参数bmwX5,则返回一个BMWX5对象,请实现该场景。   

Factory类

package com.anchor.common.design.factory.simplefactory;

/**
 * @PackgeName: com.anchor.common.design.factory.simplefactory
 * @ClassName: BMWFactory
 * @Author: Administrator
 * Date: 2022/5/11 9:52
 * project name: DesignModelTestWork
 * @Version:
 * @Description:
 */
public class BMWFactory {
    public static BMWCar getCar(String car) throws Exception
    {
        if (car.equalsIgnoreCase("BMW320")){
            return new BMW320();
        }
        else if (car.equalsIgnoreCase("BMWX5")){
            return new BMWX5() {
            };
        }else
        {
            throw new Exception("对不起,暂时无法创造该车型。");
        }
    }
}

BMWCar接口

package com.anchor.common.design.factory.simplefactory;

/**
 * @PackgeName: com.anchor.common.design.factory.simplefactory
 * @ClassName: BMWCar
 * @Author: Administrator
 * Date: 2022/5/11 9:52
 * project name: DesignModelTestWork
 * @Version:
 * @Description:
 */
public interface BMWCar {
    public void create();
}

BMW320

package com.anchor.common.design.factory.simplefactory;

/**
 * @PackgeName: com.anchor.common.design.factory.simplefactory
 * @ClassName: BMW320
 * @Author: Administrator
 * Date: 2022/5/11 9:55
 * project name: DesignModelTestWork
 * @Version:
 * @Description:
 */
public class BMW320 implements BMWCar{
    @Override
    public void create() {
        System.out.println("成功创建了一台宝马320...");
    }
}

BMWX5

package com.anchor.common.design.factory.simplefactory;

/**
 * @PackgeName: com.anchor.common.design.factory.simplefactory
 * @ClassName: BMWX5
 * @Author: Administrator
 * Date: 2022/5/11 9:56
 * project name: DesignModelTestWork
 * @Version:
 * @Description:
 */
public class BMWX5 implements BMWCar{
    @Override
    public void create() {
        System.out.println("成功创建了一台宝马X5......");
    }
}

简单工厂模式优缺点
优点:

构造容易,逻辑简单。通过使用工厂类,外界不再需要关心如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有功能(方法)。
缺点:

1.简单工厂模式中的if else判断非常多,完全是Hard Code,如果有一个新产品要加进来,就要同时添加一个新产品类,并且必须修改工厂类,再加入一个 else if 分支才可以, 这样就违背了 “开放-关闭原则”中的对修改关闭的准则了。当系统中的具体产品类不断增多时候,就要不断的修改工厂类,对系统的维护和扩展不利。
2.一个工厂类中集合了所有的类的实例创建逻辑,违反了高内聚的责任分配原则,将全部的创建逻辑都集中到了一个工厂类当中,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。因此一般只在很简单的情况下应用,比如当工厂类负责创建的对象比较少时。
3.简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
适用环境:

工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值