设计模式之工厂方法模式

工厂方法模式定义

定义了一个创建对象对象的接口,但由子类决定要实例化的类时哪一个。工厂方法让类把实例化推迟到子类

通用类图

工厂方法模式

具体实现

工厂方法模式是把产品的实例化过程封装到工厂类中,这样就降低了客户与具体产品类之间的耦合,客户不需要知道产品对象创建的具体过程,而且如果产品对象的创建过程在后期有改变,那么只需改变工厂方法,而不用改变每一个客户。每一个具体的产品类对应一个具体的工厂类,用于创建该产品,这就是把类的实例化推迟到子类中。客户依赖于工厂类,想要创建某个产品对象,就使用相应的工厂类对象进行创建。

下面就来看看具体的代码实现:

首先是定义一个产品接口Product:

package com.yrs.factoryMethod;

/**
 * @Author: yangrusheng
 * @Description: 产品接口
 * @Date: Created in 10:20 2018/7/25
 * @Modified By:
 */
public interface Product {
    void printName();
}

然后是具体的产品类ConcreteProduct1、ConcreteProduct2:

package com.yrs.factoryMethod;

/**
 * @Author: yangrusheng
 * @Description: 产品具体实现类
 * @Date: Created in 9:42 2018/7/26
 * @Modified By:
 */
public class ConcreteProduct1 implements Product {
    public void printName() {
        System.out.println(this.getClass().getName());
    }
}
package com.yrs.factoryMethod;

/**
 * @Author: yangrusheng
 * @Description: 产品具体实现类
 * @Date: Created in 9:42 2018/7/26
 * @Modified By:
 */
public class ConcreteProduct2 implements Product {
    public void printName() {
        System.out.println(this.getClass().getName());
    }
}

有了产品类后就要定义相应的工厂类,下面是工厂接口Factory:

package com.yrs.factoryMethod.ManyFactory;

import com.yrs.factoryMethod.Product;

/**
 * @Author: yangrusheng
 * @Description:
 * @Date: Created in 10:27 2018/7/26
 * @Modified By:
 */
public interface Factory {
    Product createProduct();
}

下面是具体的工厂类Product1Factory、Product2Factory:

package com.yrs.factoryMethod.ManyFactory;

import com.yrs.factoryMethod.ConcreteProduct1;
import com.yrs.factoryMethod.Product;

/**
 * @Author: yangrusheng
 * @Description:
 * @Date: Created in 10:26 2018/7/26
 * @Modified By:
 */
public class Product1Factory implements Factory {
    public Product createProduct() {
        return new ConcreteProduct1();
    }
}
package com.yrs.factoryMethod.ManyFactory;

import com.yrs.factoryMethod.ConcreteProduct2;
import com.yrs.factoryMethod.Product;

/**
 * @Author: yangrusheng
 * @Description:
 * @Date: Created in 10:26 2018/7/26
 * @Modified By:
 */
public class Product2Factory implements Factory {

    public Product createProduct() {
        return new ConcreteProduct2();
    }
}

那么最后就是我们的客户类Client:

package com.yrs.factoryMethod.ManyFactory;

import com.yrs.factoryMethod.Product;

/**
 * @Author: yangrusheng
 * @Description:
 * @Date: Created in 10:29 2018/7/26
 * @Modified By:
 */
public class Client {
    public static void main(String[] args) {

        Factory factory = new Product1Factory();
        Product product = factory.createProduct();
        //业务处理
        product.printName();

        factory = new Product2Factory();
        product = factory.createProduct();
        //业务处理
        product.printName();
    }
}

代码在GitHub上的地址:
https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/FactoryMethod/ManyFactory

优点

工厂方法模式的优点:

  • 良好的封装性,代码结构清晰。降低模块间的耦合。
  • 良好的扩展性
  • 屏蔽产品类,调用者只需关心产品类的接口,而无需关心产品类的具体实现
  • 典型的解耦框架。符合迪米特法则,也符合依赖倒置原则,当然也符合里氏替换原则。

简单工厂模式

简单工厂模式是定义一个工厂类,该类定义了一个静态的依据产品类型类创建产品对象的方法。工厂类的实现如下:

package com.yrs.factoryMethod.simpleFactory;

import com.yrs.factoryMethod.ConcreteProduct1;
import com.yrs.factoryMethod.ConcreteProduct2;
import com.yrs.factoryMethod.Product;

/**
 * @Author: yangrusheng
 * @Description: 简单工厂模式
 * @Date: Created in 18:19 2018/8/12
 * @Modified By:
 */
public class ProductFactory {

    public static Product createProduct(String type) {
        if ("product1".equals(type)) {
            return new ConcreteProduct1();
        } else if ("product2".equals(type)) {
            return new ConcreteProduct2();
        }
        return null;
    }

}

其他相关的代码:
https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/FactoryMethod/simpleFactory

工厂方法是一个非常实用的模式,但是其缺点是工厂类的扩展比较困难,不符合开闭原则。

参考

  1. 《设计模式之禅–第2版》
  2. 《大话设计模式》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值