java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java工厂方法模式

Java设计模式之工厂方法模式详解

作者:niuyongzhi

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品

1.工厂方法是什么

众所周知,工厂是生产产品的,并且产品供消费者使用。消费者不必关心产品的生产过程,只需要关心用哪种产品就行。

在Java世界中,工厂方法模式和现实功能类似。工厂即一个工厂类,提供获得对象(产品)的方法(工厂方法)。其他类(消费者)需要用到某个对象时,只需调用工厂方法就行,不必new这个对象。

2.如何实现

1)创建产品的抽象类或接口---抽象产品

2)创建具体产品的类---具体产品

3)创建工厂的抽象类或接口---抽象构造类

4)创建具体工厂类---具体构造类

3.代码实现

     比如想要获得车的参数信息,轮胎信息等。

1)抽象产品

/**
 * 产品抽象类
 */
public abstract class Tyre {
    String name;
    public abstract void getName();
}

2)具体产品

/**
 * 具体产品
 */
public class MichelinTyre extends Tyre {
    MichelinTyre(){
        name = "米其林轮胎";
    }
    @Override
    public void getName() {
        System.out.println("car name :"+name);
    }
}

3)抽象构造类

/**
 * 抽象构造类
 */
public abstract class Car {
    /**
     * 对外提供产品的抽象方法
     * @return
     */
    public abstract Tyre getTyre();
}

4)具体构造类

/**
 * 具体构造类
 */
public class BydCar extends Car {
    /**
     * 对外提供获得对象的方法。
     * 当用户想要获得某个产品时,可以通过相应的工厂方法来获取,而不是直接通过new的方式。
     * 优点:避免用户通过new来获取对象,让用户代码和产品代码解耦。
     * @return
     */
    @Override
    public Tyre getTyre() {
        return new MichelinTyre();
    }
}

5)测试类

/**
 * 测试类
 */
public class Main {
    public static void main(String args []){
        Tyre tyre;
        Car car = new BydCar();
        tyre = car.getTyre();
        tyre.getName();
    }
}

4.工厂方法模式的优点

1)可以让用户代码和某个特定对象的子类的代码解耦

2)用户不必关心他所使用的对象是如何创建的,只需要知道该对象有哪些方法可供调用即可。

5.拓展

工厂模式在Java集合框架中的应用案例

        Collection<Integer> list = new LinkedList<Integer>();
        for(int i = 0;i<5;i++){
            list.add(i);
        }
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

在Collection接口中定义了一个 iterator方法,返回Iterator接口的实例。

   Iterator接口----抽象产品

   Iterator的实现类---具体产品

   Collection接口---抽象构造

  LinkedList链表类--具体构造类

到此这篇关于Java设计模式之工厂方法模式详解的文章就介绍到这了,更多相关Java工厂方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文