Java 23种设计模式之简单工厂模式(一)

1.概述

1.1介绍

简单工厂模式中,工厂类提供一个创建产品的工厂方法,用于创建各种产品。客户端只需传入对应的参数,利用该方法即可根据传入参数的不同返回不同的具体产品对象。

1.2定义

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
因为在简单工厂模式用于创建实例的方法是静态的方法,因此简单工厂模式又被称为静态工厂方法模式,它属于类创建型模式。

1.3结构图

1.4角色

Factory(工厂角色):即工厂类,负责实现创建所有产品实例的内部逻辑,工厂类可以被外界直接调用,创建所需要的产品对象,在工厂类中提供了一个静态工厂方法用于获取产品
Product(抽象产品角色):是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法。Product会提高系统的灵活性,使得在工厂类只需要定义一个通用的工厂产品方法,因为所有创建的具体产品都是其子类对象
ConcreteProduct(具体产品角色):所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法

2.实现

2.1步骤

定义抽象产品角色:定义为抽象类/接口,封装各种产品对象的公有方法

定义具体产品角色:实现/继承抽象产品角色,实现其中声明的方法

定义工厂角色:提供静态获取具体产品方法,根据传入参数的不同返回不同的产品

2.2抽象产品角色

public interface Product {
    void sell();
}

2.3具体产品角色

实现抽象产品 角色接口

public class Product1 implements Product{
    @Override
    public void sell() {
        System.out.println("产品1销售打9.5折");
    }
}
public class Product2 implements Product{
    @Override
    public void sell() {
        System.out.println("产品2销售打9折");
    }
}

2.4工厂角色

由于工厂角色需要根据传入参数不同返回不同的具体产品,因此通常使用枚举作为传入参数,先定义具体产品的枚举类:

public enum ConcreteProduct {
    A, B;
}

借着定义静态工厂方法

public static Product get(ConcreteProduct type)
    {
        switch (type) 
        {
            case A:
                return new ConcreteProduct1();
            case B:
                return new ConcreteProduct2();
            default:
                return null;
        }
    }

根据参数的不同创建不同的具体产品实例并返回。

public class testFactory {

    public static void main(String[] args) {
        Product product = Factory.get(ConcreteProduct.A);
        product.sell();
        product = Factory.get(ConcreteProduct.B);
        product.sell();
    }
}

返回结果

产品1销售打9.5折
产品2销售打9折

Process finished with exit code 0

为了简化

这样可以通过抽象产品类的静态方法获取子类对象,优化代码如下:

public interface Product {
    void sell();

    public static Product get(ConcreteProduct type)
    {
        switch (type)
        {
            case A:
                return new Product1();
            case B:
                return new Product2();
            default:
                return null;
        }
    }
}

3.优点

分离职责:简单工厂模式实现了对象创建以及使用的分离,工厂类包含必要的判断逻辑,可以决定在什么时候创建什么哪一个产品的实例,客户端可以免除直接创建产品对象的职责,仅仅是“消费”产品

简化记忆:客户端无须知道具体产品类的名字,只需要知道对应的参数即可,一般使用常量字符串或者枚举

提高灵活性:可以引入配置文件在不修改客户端代码情况下增加新的具体产品类,提高灵活性

4.缺点

工厂职责过重:工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都要受影响

复杂度增加:由于引入了工厂类会增加系统中类的个数,会增加系统的复杂度和理解难度

扩展困难:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型过多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护

无法继承:简单工厂模式使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构

5.试用场景

工厂类负责创建的对象比较少,由于创建对象较少,不会造成工厂方法中的业务逻辑太过复杂

客户端只需要知道传入工厂类的参数,对如何创建对象不关心

  • 37
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值