设计模式(一)简单工厂模式

设计模式(一):简单工厂模式

Github

关于23设计模式的讲解文件已经放在我的 GitHub上,欢迎大家Fork和Star

模式动机

​ 做过Web开发的开发者都知道,在将用户的密码存储在数据库中时,我们需要将密码首先加密然后在写入数据库。 在Java中,我们常用的加密手段有MD5、RSA等。我们使用的代码是:

KeyPairGenerator.getInstance("RSA");

如果我们需要使用MD5时传入的参数就是MD5。这里,就是我们今天需要讲解的简单工厂模式。

模式定义

​ 简单工厂模式又称为静态工厂模式,这个模式数据创建式模式。在简单工厂模式中,根据传入的参数,返回不同类的实例。

模式结构

简单工厂模式包含如下角色:

1.Factory:工厂角色

​ 工厂角色负责实现创建所有实例的内部逻辑

2.Product:抽象产品角色

​ 抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口

3.ConcreteProduct:具体产品角色

​ 具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

这里写图片描述

时序图

这里写图片描述

代码示例

这里我们首先创建一个抽象对象Product:

package cn.edu.hust.simpleFactory;

public abstract class Product {
    public abstract void use();
}

然后创建两个实现类ProductA和ProductB

package cn.edu.hust.simpleFactory;

public class ProductA extends Product
{
    @Override
    public void use() {
        System.out.println("using ProductA");
    }
}
package cn.edu.hust.simpleFactory;

public class ProductB extends Product {
    public void use() {
        System.out.println("using productB");
    }
}

最后创建一个工厂类

package cn.edu.hust.simpleFactory;

public class ProductFactory {
    public Product createProduct(String productType)
    {
        if("ProductA".equals(productType))
        {
            return new ProductA();
        }
        else
        {
            return new ProductB();
        }
    }

工厂类根据参数返回不同的实现类。

模式优点

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

模式缺点

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

模式应用

JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间。

public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale locale);

微信公众号

有兴趣的同学可以关注小编哟!
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Oeljeklaus/article/details/81042656