设计模式之简单工厂模式

看过《笑傲江湖》的朋友大概会有这样一个感触,令狐冲虽然是大师兄,但是基本武功算不上厉害,开篇就被千里独行田伯光打的几乎还手之力,但是练习了独孤九剑之后,吊打淫贼田伯光。究其原因,还是他学会了不用死招式,每个招式都不是死搬硬套,而是学会了灵活组合。Java基础语法算是基本功,而设计模式堪比独孤九剑。

独孤九剑有九式,设计模式有23式,独孤九剑要一招一招学,设计模式也一样,今天我们就来学习学习简单工厂模式。

概念

简单工厂模式是一种类的创建型模式,又叫做静态工厂方法模式。它通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。这个模式的关键在于工厂类,它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。简单工厂模式属于工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

简单例子

// 首先,我们定义一个公共的父类  
public abstract class Shape {  
    public abstract void draw();  
}  
  
// 然后我们创建两个子类,它们都继承自Shape类  
public class Circle extends Shape {  
    @Override  
    public void draw() {  
        System.out.println("Drawing Circle");  
    }  
}  
  
public class Rectangle extends Shape {  
    @Override  
    public void draw() {  
        System.out.println("Drawing Rectangle");  
    }  
}  
  
// 接下来我们创建一个工厂类,这个类会根据用户的需求来创建相应的对象  
public class ShapeFactory {  
    // 使用 getShape 方法来获取形状类型的对象  
    public Shape getShape(String shapeType){  
        if(shapeType == null){  
            return null;  
        }        
        if(shapeType.equalsIgnoreCase("CIRCLE")){  
            return new Circle();  
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){  
            return new Rectangle();  
        }  
        return null;  
    }  
}  
  
// 最后,我们通过工厂类来创建并使用对象  
public class FactoryPatternDemo {  
    public static void main(String[] args) {  
        ShapeFactory shapeFactory = new ShapeFactory();  
          
        // 获取一个Circle对象,并调用它的draw方法  
        Shape shape1 = shapeFactory.getShape("CIRCLE");  
        shape1.draw();  
          
        // 获取一个Rectangle对象,并调用它的draw方法  
        Shape shape2 = shapeFactory.getShape("RECTANGLE");  
        shape2.draw();  
    }  
}

在这个例子中,我们创建了一个Shape抽象类和两个具体的子类CircleRectangle。然后我们创建了一个ShapeFactory工厂类,它有一个getShape方法,可以根据传入的字符串来创建相应的对象。最后,我们在FactoryPatternDemo主类中通过工厂类来创建并使用这些对象。

有朋友可能会发现,这里我们每次调用工厂类,都会获取一个新的对象,这里看场景可能会跟单例模式结合,单例模式我们以后讲,今天只看工厂模式。

什么场景我们考虑用简单工厂模式

  1. 创建对象的场景:当需要创建对象的场景中,如果对象是同一个类型的,或者继承自同一个父类,可以考虑使用简单工厂模式。
  2. 减少代码量:如果需要创建多个相同类型的对象,通过简单工厂模式可以减少代码量,避免重复的代码。
  3. 提高可维护性:通过简单工厂模式,可以将对象的创建和使用分离,使得代码更加模块化,提高可维护性。
  4. 灵活性和可扩展性:简单工厂模式可以灵活地扩展和修改对象创建的逻辑,使得代码更加灵活和可扩展。
  5. 单一职责原则:简单工厂模式符合单一职责原则,将对象的创建和使用分离,使得每个类都有明确的职责和功能。
  6. 线程安全:简单工厂模式通常是在单线程环境下使用的,因此线程安全问题相对较小。但如果是在多线程环境下使用,需要考虑线程安全问题,如同步机制等。

简单工厂模式有以下一些弊端

  1. 增加新产品时,必须修改工厂逻辑,这使得系统扩展变得困难。在产品类型较多的情况下,可能导致工厂逻辑过于复杂,不利于系统的扩展和维护。
  2. 由于工厂类集中了所有产品创建逻辑,一旦工厂类不能正常工作,整个系统都会受到影响。
  3. 简单工厂模式使用了静态工厂方法,这使得工厂角色无法形成基于继承的等级结构。
  4. 简单工厂模式增加了系统中类的个数,这在一定程序上增加了系统的复杂度和理解难度。

那什么是工厂模式呢?跟简单工厂模式有什么区别

工厂模式是一种创建型设计模式,它提供了一个用于创建对象的接口,但让子类决定要实例化哪个类。工厂模式的实现通常涉及到一个抽象工厂类,这个抽象工厂类定义了创建对象的接口,并由具体的工厂子类来实现这个接口。

与简单工厂模式相比,工厂模式更加抽象和灵活。简单工厂模式是通过一个工厂类来创建特定类型的对象,而工厂模式是通过抽象工厂类来创建一系列相关或者互相依赖的对象。在工厂模式中,每个子类都负责实现一个特定的产品族,这样可以更好地支持“开放-封闭”原则,即可以在不修改现有代码的情况下增加新的产品。

此外,简单工厂模式通常使用静态方法作为工厂方法,而工厂模式则使用抽象方法来定义创建对象的接口,子类通过实现这个接口来创建对象。这种抽象的结果是,在不修改具体工厂类的情况下引进新的产品。

总之,工厂模式相对于简单工厂模式更加灵活、抽象和可扩展,可以更好地支持“开放-封闭”原则,适用于需要创建一系列相关或者互相依赖的对象的场景中。

工厂模式的分类

  1. 简单工厂模式:这种模式只有一个工厂类,根据传入的参数来创建不同的产品实例。这种模式实现了低耦合,但破坏了高内聚,因为产品的创建逻辑与使用逻辑分离了。
  2. 工厂方法模式:这种模式将工厂类改为抽象类,每个工厂子类对应创建一个具体产品类。这种模式实现了高内聚和低耦合,但当产品种类过多时,会产生大量的子类,增加维护的难度。
  3. 抽象工厂模式:这种模式增加了产品等级结构,适用于对一系列相互依赖的对象进行创建工作。如果只需要创建一个对象,使用简单工厂模式即可;如果有多个对象需要创建,并且这些对象的类型存在依赖关系,那么可以使用工厂方法模式;如果有一系列相互依赖的对象需要创建,并且这些对象的类型之间存在明显的等级结构,那么可以使用抽象工厂模式。

Spring中有没有工厂模式的例子

Spring框架中有很多工厂模式的例子。其中最常用的是Spring容器中的BeanFactory和ApplicationContext。

BeanFactory是Spring容器中用于创建和管理Bean的接口。它定义了获取Bean的接口,并且可以配置Bean的属性、依赖关系等。在Spring容器初始化时,会根据配置文件或注解等方式,创建并初始化所有的Bean实例。

ApplicationContext是Spring容器中的高级接口,它继承了BeanFactory接口,并提供了更多的功能。ApplicationContext可以自动装配Bean之间的依赖关系,支持自定义的初始化器和监听器,提供了事件处理机制等。

在Spring容器中,使用工厂模式可以让我们更加方便地管理和使用Bean对象。通过使用工厂模式,我们可以将对象的创建和使用分离,提高代码的可维护性和可读性。

这个留待我们以后深入学习,这次只了解。

设计模式怎么学

  1. 理解设计模式的基本概念和分类:首先需要了解什么是设计模式,以及设计模式的基本分类。常见的设计模式包括单例模式、工厂模式、建造者模式、原型模式、适配器模式、桥接模式等。
  2. 掌握每个设计模式的功能和基本结构:学习每个设计模式的功能和基本结构,以及它们的应用场景。对于每个设计模式,需要了解它的目的、问题、解决方案、基本结构、参与者、协作方式等方面。
  3. 学习设计模式的实现方式:学习设计模式的实现方式,包括在编程语言中的实现方式和在具体项目中的应用方式。需要掌握每个设计模式的实现细节,以及如何根据实际需求进行相应的调整。
  4. 实践应用:通过实践应用来加深对设计模式的理解。可以找一些小项目或者模拟项目,尝试使用设计模式来解决实际问题。通过实践,可以更好地理解设计模式的应用场景和实现方式,并且能够更灵活地运用它们。
  5. 参与社区和团队讨论:参与社区和团队讨论可以帮助你更好地学习和理解设计模式。通过与其他学习者和开发者交流,可以了解他们对设计模式的理解和应用经验,从而拓宽自己的思路和视野。
  6. 不断学习和总结:设计模式是一门不断学习的学问,需要不断地学习和总结。需要保持对新技术的关注和学习,以及对设计模式的不断探索和研究。同时,也需要对自己的学习过程进行总结和反思,以便更好地提高自己的设计模式应用能力。

总之,学好设计模式需要掌握基本概念和分类,理解每个设计模式的功能和基本结构,学习其实现方式,并不断实践应用、参与社区和团队讨论、不断学习和总结。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值