设计模式——工厂方法模式(Java)

设计模式——工厂方法模式(Java)

                                        ——Javee

在介绍工厂方法模式之前,我们先了解一下Java的四大特性,即抽象、封装、继承、多态。

  • 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意 与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

  • 继承:子类拥有父类一切非私有的属性和方法。

  • 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面       向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

  • 多态性:同一种事物的不同种表现形式。

工厂方法模式( Factory Method)的核心是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

  • 抽象工厂(Creator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

  • 具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。

  • 抽象产品(Product):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

  • 具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

优点:工厂类包含产品的判断逻辑,可以决定创建哪一个产品类的实例,客户端可以免除直接创建产品对象 的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于 创建对象。

缺点:由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。使用简单工厂模 式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。系统扩展困难,一旦添加新产 品就不得不修改工厂逻辑,在产品类型较多时,可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

实际案例分析:手机厂--生产手机

分析:需要一个手机工厂类,类中具有生产手机的功能(创建手机对象);工厂类,为手机工厂的父类或实现的接口,具有所有手机工厂类的共同方法;手机类:具有手机的共同方法,抽象类或者接口表示;

//简单工厂模式
package cn.edu.ncu.online.Test1;

/**
 * @Author Javee
 * @Date 2019/8/13 17:41
 * @Description
 */
public class Test {
    public static void main(String[] args){
        FactoryHuawei factoryHuawei = new FactoryHuawei();
        Phone huawei = factoryHuawei.newPhone();        //使用多态实现,用户只知道创建产品的工厂名,而不知道具体的产品名
        huawei.show();

        FactoryOnePlus factoryOnePlus = new FactoryOnePlus();
        Phone oneplus = factoryOnePlus.newPhone();
        oneplus.show();
    }
}

//抽象手机接口
interface Phone{
    void show();
}

//抽象工厂接口
interface Factory{
    Phone newPhone();
}

//具体产品->Huawei
class Huawei implements Phone{
    @Override
    public void show() {
        System.out.println("Huawei具体展示");
    }
}

//具体产品->OnePlus
class OnePlus implements Phone{
    @Override
    public void show() {
        System.out.println("OnePlus具体展示");
    }
}

//具体工厂->实现华为手机的生产
class FactoryHuawei implements Factory{
    @Override
    public Phone newPhone() {
        System.out.println("具体工厂->实现华为手机的生产...");
        return new Huawei();
    }
}

//具体工厂->实现一加手机的生产
class FactoryOnePlus implements Factory{
    @Override
    public Phone newPhone() {
        System.out.println("具体工厂->实现一加手机的生产...");
        return new OnePlus();
    }
}

具体工厂->实现华为手机的生产...
Huawei具体展示
具体工厂->实现一加手机的生产...
OnePlus具体展示

工厂方法模式通常适用于以下场景:

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。

  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。

  • 客户不关心创建产品的细节,只关心产品的品牌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值