详解设计模式:简单工厂模式

简单工厂模式(Smiple Factory Pattern):定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,简单工厂模式也被称为静态工厂模式。

本篇内容包括:工厂模式 概述、关于 简单工厂模式、简单工厂模式 Demo。




一、工厂模式 概述

工厂方法是一种十分常用的创建型设计模式,它在父类中提供了创建对象的接口但允许子类更改将要创建的对象的类型。

1、工厂模式的使用场景

在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。

2、工厂模式的分类

一般情况下,我们所提及的“工厂模式”会被细分为三种,即简单工厂、工厂方法和抽象工厂。而 GoF 的《设计模式》一书中,它将简单工厂模式看作是工厂方法模式的一种特例,所以工厂模式只被分成了工厂方法和抽象工厂两类。


二、关于 简单工厂模式

1、关于 简单工厂模式

简单工厂模式(Smiple Factory Pattern):定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,简单工厂模式也被称为静态工厂模式。

简单工厂模式将产品的“消费”和“生产”完全分开,调用房,只需要自己需要什么产品,和如何使用就可以了,而对于产品的具体生产任务,则由工厂类来实现。

工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。

2、关于 简单工厂模式的构成

简单工厂的构成:

  • 具体的工厂角色(Factory):工厂角色即工厂类,他是简单工厂模式的核心,负责创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需要的产品对象;在工厂类中提供进后台的工厂方法 factoryMethod(),它返回的产品类型为抽象的产品类型 Product。
  • 抽象的产品角色(Product):它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入提高了系统的灵活性,使得在工厂类中只需要定义一个通用的工厂方法,因为所有创建的具体产品都是其子类对象。
  • 具体的产品角色(ConcreteProduct):简单工厂的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都集成了抽象产品角色,需要在实现在抽象产品中声明的抽象方法。
3、关于 简单工厂模式的实现

首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;

其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;

然后,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据传入的参数不同创建不同的具体产品对象;

最后,客户端只需要调用工厂类的工厂方法并传入响应的参数即可得到一个具体产品对象。

4、关于 简单工厂模式的优缺点

优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。

缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则


三、简单工厂模式 Demo

1、Demo 设计

# 角色

DemoFactory、DemoAbstractProduct、DemoProductA、DemoProductB

在这里插入图片描述

# 实现

DemoAbstractProduct 是作为产品角色的抽象父类,DemoProductA、DemoProductB 是作为产品角色的具体实现的子类。

DemoFactory 作为具体工厂角色,通过方法 factoryMethod(String productName) 根据 productName 返回对应的工厂。

2、Demo 实现

# DemoAbstractProduct 抽象产品类

//抽象产品类
public abstract class DemoAbstractProduct {
    //抽象产品方法
    public abstract sayHi();
}

# DemoProductA 具体产品类A

//继承抽象类实现产品A类
public class DemoProductA extends DemoAbstractProduct {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductA");
    }
}

# DemoProductB 具体产品类B

//继承抽象类实现产品B类
public class DemoProductB extends DemoAbstractProduct {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductB");
    }
}

# DemoFactory 产品工厂类

public class DemoFactory {
    
    public DemoFactory() {}
    
    //第一种写法
    //根据产品名称生产产品
    public DemoAbstractProduct factoryMethod(String productName) {
        DemoAbstractProduct product = NULL;
        switch(productName){
            case "A":
                product = new DemoProductA();//生产产品A
                break;
            case "B":
                product = new DemoProductB();//生产产品B
                break;
            default:
                break;
        }
        return product;
    }
}
3、Demo 测试
public class Client {
    public static void main(String[] args) {
        DemoAbstractProduct product;
        //通过工厂类创建具体产品对象
        product = DemoFactory.factoryMethod("A");
        product.sayHi();
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栗筝i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值