必威体育Betway必威体育官网
当前位置:首页 > IT技术

设计模式之工厂方法模式

时间:2019-06-27 14:43:13来源:IT技术作者:seo实验室小编阅读:77次「手机版」
 

工厂方法模式

工厂方法模式定义

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

通用类图

工厂方法模式

具体实现

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

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

首先是定义一个产品接口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. 《大话设计模式》

相关阅读

程序员经常说的「设计模式」到底是什么?

当程序员说去「设计模式」时,你是否会一脸懵逼,到底什么是设计模式呢?很多人应该听说过设计模式(Design pattern),又或多或少的看过或用

Java设计模式之委派模式

委派模式有点像代理模式又有点像策略模式。例如:公司老板给项目经理下达任务,将任务全权交给项目经理,由项目经理根据一定的策略将任

Head First 设计模式(中文版)【高清pdf下载】

放心下载pdf地址:https://u17513197.pipipan.com/fs/17513197-291576928必看理由:荣获2005年第十五届Jolt通用类图书震撼大奖,设计模

APP导航设计模式与信息布局设计模式

因为最近接触到APP设计类似的工作,所以我来梳理一下如今市面上流行的APP导航设计模式以及信息布局设计模式。因为还没有深刻体会到

如何才能达到以用户为中心的网站设计模式?

图片来源图虫:已授站长之家使用网站设计是一个复杂的过程。你知道的,我指的不仅仅是设计和开发部分。总的来说,设计思维过程和决策阶

分享到:

栏目导航

推荐阅读

热门阅读