设计模式——工厂方法模式(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 电视工厂、海信电视工厂等。
-
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
-
客户不关心创建产品的细节,只关心产品的品牌。