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

模式动机
​ 做过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);
  • Product:抽象产品角色抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

原文:https://github.com/oeljeklaus-you/Design-Patterns/blob/master/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F(%E4%B8%80)%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F.md

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值