Java设计模式-工厂模式

简介: Java设计模式

简单来说工厂模式就是帮助我们创建对象,隐藏了对象创建过程的复杂度(如类B需要调用类A,工厂类提供A类的创建接口,B只需要调用接口传入相应参数即可)、避免你辛苦的准备构造方法的参数。说白了--就是工厂提供产品给客户(按照提供的方式不同分成三类:简单工厂、工厂、抽象工厂) 具体简介看下面:

f9fe6309678bb9af06e6f57e6957066.png

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,可以考虑是否使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量

角色

工厂模式有以下几个角色(结合下面流程图理解),产品即需要创建的实例对象

  • 抽象产品类:所创建产品的父类,给出一个抽象接口或抽象类,以及一般由具体产品类具体实现。(多态的表现)--- 如 Animal
  • 具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。 --- 如 Dog
  • 抽象工厂类:工厂提供创建产品的方法、工厂方法模式的核心(简单工厂模式无此抽象类),与应用程序无关。是具体工厂必须实现的接口或者必须继承的父类。
  • 具体工厂类:继承抽象工厂类,实现具体业务逻辑。

工厂模式和抽象工厂模式

图解工厂模式和抽象工厂模式流程对比

工厂模式

54cf840a53bf23fbda70ae2f88d88e6.png

抽象工厂模式

2ff5496bfd0a4c01bf4c8c918915f8f.png

简单工厂模式(静态工厂方法)

含义:没有抽象工厂类,由工厂类自身提供产品,代码如下

抽象产品类(抽象类或接口)

public interface IProduct{
    void method();
}

具体产品实现类

//A产品
public class ProductA implement IProduct{
    void method(){
        logger.info("ProductA");
    }
}
//B产品
public class ProductB implement IProduct{
    void method(){
        logger.info("ProductB");
    }
}

工厂类

public class Factory{
    //简单工厂模式 只有一个静态方法提供产品所以也叫静态工厂方法
    public static IProduct createProduct(String productName){
        if("A".equals("A"){
            return new ProductA();
        }else if("B".equals("B"){
            return new ProductB();
        }else
    }
}
  • 优点: 强调职责单一原则,一个类只提供一种功能
  • 缺点: 一旦对工厂类修改就违反了开闭原则

工厂模式

工厂模式有一个抽象工厂类对应多个具体工厂实现类、一个抽象产品类对应一个具体实现类、并且每个具体工厂类只能创建一个具体产品类的实例

抽象产品类(抽象类或接口)

public interface IProduct{
    void method();
}

具体产品实现类

//A产品
public class ProductA implement IProduct{
    void method(){
        logger.info("ProductA");
    }
}
//B产品
public class ProductB implement IProduct{
    void method(){
        logger.info("ProductB");
    }
}

抽象工厂类(抽象类或接口)

public abstract class Factory{    
/**  
*抽象工厂方法  
*具体产生什么由子类决定  
*@return 具体产品对象  
*/    
public abstract IProduct createProduct();    
}     

具体工厂类

//A工厂
public class AFactory extends Factory {
    //提供A产品
    public  IProduct createProduct(){
        return new ProductA();
     }
}
//B工厂
public class BFactory extends Factory {
    //提供B产品
    public  IProduct createProduct(){
        return new ProductB();
     }
}

用法

Factory factory = new AFactory();  
IProduct aProduct = factory.createProduct();  
product.method();  
  • 优点:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广
  • 缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

抽象工厂模式

工厂模式有一个抽象工厂类对应多个具体工厂实现类、多个抽象产品类对应多个具体实现类、并且每个具体工厂类可以创建多个具体产品类的实例。

抽象产品类(抽象类或接口)

//饮料
public interface IDrink{
    void method();
}
//食物
public interface IFood{
    void method();
}

具体产品实现类

//面条
public class Noddle implement IFood{
    void method(){
        logger.info("面条");
    }
}
//米饭
public class Rice implement IFood{
    void method(){
        logger.info("米饭");
    }
}
//可乐
public class Cola implement IDrink{
    void method(){
        logger.info("可乐");
    }
}
//米饭
public class Sprite implement IDrink{
    void method(){
        logger.info("雪碧");
    }
}

抽象工厂类(抽象类或接口)

public abstract class Factory{    
/**  
*抽象工厂方法  
*具体产生什么由子类决定  
*@return 具体产品对象  
*/    
public abstract IFood createFoodProduct();    
public abstract IDrink createDrinkProduct();    
}     

具体工厂类

//A餐工厂(提供可乐和米饭)
public class AFactory extends Factory{
    //提供可乐
    public  IDrink createDrinkProduct(){
        return new Cola();
     }
     //提供米饭
    public  IFood  createFoodProduct(){
        return new Rice();
     }   
}
//B餐工厂(提供面条和雪碧)
public class BFactory extends Factory{
    //提供面条
    public  IFood createFoodProduct(){
        return new Noddle();
     }
 //提供雪碧
    public  IDrink createDrinkProduct(){
        return new Sprite();
     }
}

用法

Factory factory = new AFactory();  
IDrink cola = factory.createDrinkProduct();  
cola.method(); 
IFood riceFood = factory.createFoodProduct(); 
riceFood.method();  
  • 优点
  1. 具有工厂方法模式解耦的优点。
  2. 工厂模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构的。
    最主要的是可以在类内部对产品族的关联关系进行定义和描述。
  • 缺点
  1. 产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
  2. 在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一个套餐不会包含两款饮料(一款车子不可以搭载两种空调)。

总结

有利有弊

优点:将对象的创建统一起来便于维护和整体把控,对扩展开放,对修改封闭

缺点:耦合性提高,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。

使用有限制

从工厂模式的示例可以看出:工厂模式需要类实现它的接口并且在业务内部存在明显的继承关系,比如汽车和奔驰宝马的关系。而继承关系往往存在于模型之间,业务之间很难存在继承关系,因此如果业务内部或者业务之间没有这种显式的继承关系该咋办?就算业务内部有继承关系,各个业务交给你统一管理,这样就会提高代码的耦合性,当创建逻辑复杂的时候,工厂方法就很复杂,容易产生干扰。

其开闭性优点很容易被替代

可以通过高度层次化和模块化来提高系统的开闭性,而不必生硬地去套用工厂模式。


目录
相关文章
|
12天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
22天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
29 4
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
49 0
[Java]23种设计模式
|
27天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
3月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
3月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)