简单工厂模式

简单工厂模式

所谓组件:从设计上讲,组件就是能完成一定功能的封装体。小到一个类,大到一个系统,都可以称为组件,

因为一个小系统放到更大的系统里面去,也就当个组件而已。

模式定义:

提供一个创建对象实例Factory的功能,而无须关心其具体实现。被创建实例的类型可以是接口Fruit、抽象类,也可以是具体的类Apple、Banana。

接口Fruit

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:07
 * @Description 接口的定义,该接口可以通过简单工厂来创建
 */
public interface Fruit {
    /**
     * 示意,具体功能方法的定义
     * @param s 示意,需要的参数
     */
    public void price(double s);
}

具体实现类Apple、Banana

Apple

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:07
 * @Description
 */
public class Apple implements  Fruit {

    @Override
    public void price(double s) {
        System.out.println("今日苹果的价格是"+s);
    }
}

Banana

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:16
 * @Description
 */
public class Banana implements Fruit{
    @Override
    public void price(double s) {
        System.out.println("今日香蕉的价格是"+s);
    }
}

工厂创建实例Factory

package com.xiaobao.pattern.simplefactory;

/**
 * 工厂类,用来创建Api 对象
 */
public class Factory {
    /**
     *
     * @param type 示意,从外部传入的选择条件
     * @return 创建好的Api 对象
     */
    public static Fruit buyFruit(String  type) {
        //应该根据某些条件去选择究竟创建哪一个具体的实现对象,
        //这些条件可以从外部传入,也可以从其他途径来获取。
        //如果只有一个实现,可以省略条件,因为没有选择的必要。
        //示意使用条件
        Fruit fruit = null;
        switch (type){
            case "A":
                fruit=new Apple();

                break;
            case "B":
                fruit=new Banana();

                break;
            default:
                break;

        }

        return fruit;
    }
}

测试 SimpleFactoryDemo

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:27
 * @Description
 */
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        //通过简单工厂来获取接口对象
        Fruit fruit = Factory.buyFruit("A");
        fruit.price(25.3);
    }
}

运行结果

今日苹果的价格是25.3

优点

  1. 帮助封装

简单工厂虽然很简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。

  1. 解耦

通过简单工厂,实现了客户端和具体实现类的解耦。

如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是通过工厂获取它需要的接口对象。

缺点

  1. 可能增加客户端的复杂度

如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,

这样会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。

  1. 不方便扩展子工厂

私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。

不过,通常情况下是不需要为简单工厂创建子类的。

本质

简单工厂的本质是:选择实现。

使用场景

建议在以下情况中选用简单工厂。

  1. 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,

让客户端通过工厂来获取相应的接口,而无须关心具体的实现。

  1. 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,

可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。

点击下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值