设计模式-工厂方法模式[JAVA版]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-工厂方法模式[JAVA版]相关的知识,希望对你有一定的参考价值。

上篇讲述简单工厂模式,其优点在于通过工厂类进行业务解耦。但是工厂方法中包含了逻辑判断,根据客户端的选择条件动态实例化相关的类,如果添加新的手机型号,则需要修改工厂类里的逻辑判断,新增case去判断该型号的分支,这违背了开放-封闭的设计原则

开放-封闭原则,是说类、模块、函数等等,可以扩展,但是不能修改

 

工厂方法模式在简单工厂模式的基础上进一步抽象,将原有的工厂抽象出一个接口,这个接口只有对应一个创建工厂的方法,每一个产品都对应一个具体的工厂类。

工厂方法模式的UML如下:

技术分享

工厂方法模式的实现

首先创建一个“苹果手机”类,定义一个获取手机尺寸的方法

/**
 * 苹果手机
 * @author songwz
 *
 */
public abstract class ApplePhone {

    /**
     * 获取尺寸
     */
    protected  abstract void getSize();
}

苹果手机的不同型号的“手机类”

/**
 * Iphone4
 * @author songwz
 *
 */
public class Iphone4 extends ApplePhone{

    @Override
    public void getSize() {
        System.out.println("iPhone4屏幕:3.5英寸");
    }

}

/**
 * iPhone5
 * @author gt780
 *
 */
public class Iphone5 extends ApplePhone {

    @Override
    public void getSize() {
        System.out.println("iPhone5屏幕:4英寸");
    }

}

/**
 * iPhone6
 * @author songwz
 *
 */
public class Iphone6 extends ApplePhone{

    @Override
    public void getSize() {
        System.out.println("iPhone6屏幕:4.7英寸");
    }

}

建立工厂接口

/**
 * 抽象工厂
 * @author songwz
 *
 */
public abstract class IFactory {
    
    /**
     * 创建各个型号的手机
     * @return
     */
    protected  abstract  ApplePhone createPhone();
}

针对不同产品的不同具体工厂

/**
 * IPHONE4工厂
 * @author songwz
 *
 */
public class Iphone4Factory extends IFactory{

    @Override
    public ApplePhone createPhone() {
        return new Iphone4();
    }

}

/**
 * IPHONE5工厂
 * @author songwz
 *
 */
public class Iphone5Factory extends IFactory{

    @Override
    public ApplePhone createPhone() {
        return new Iphone5();
    }

}


/**
 * IPHONE6工厂
 * @author songwz
 *
 */
public class Iphone6Factory extends IFactory{

    @Override
    public ApplePhone createPhone() {
        return new Iphone6();
    }

}

客户端调用

public class Client {

    public static void main(String[] args) {
        IFactory iFactory = new Iphone4Factory();
        ApplePhone ap = iFactory.createPhone();
        ap.getSize();

        iFactory = new Iphone5Factory();
        ap = iFactory.createPhone();
        ap.getSize();

        iFactory = new Iphone6Factory();
        ap = iFactory.createPhone();
        ap.getSize();
    }
}

工厂方法模式把简单工厂的逻辑判断移到客户端代码进行,完善了简单工厂设计模式。

但是,每一种新的产品都需要添加一个产品类和具体的工厂类,如果产品类别较多,就会产生很多类。我们可以通过“反射”技术来解决该问题。

/**
 * 通过反射来创建各个具体工厂
 * @author songwz
 *
 */
public class Factory {

    public static ApplePhone createPhone(Class cls){
        ApplePhone applePhone = null;
        try {
            applePhone = (ApplePhone) Class.forName(cls.getName()).newInstance();
        } catch(Exception e) {
            System.out.println("出现异常");
        }
        return applePhone;
    }
}

以上是关于设计模式-工厂方法模式[JAVA版]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式--工厂模式

设计模式5:工厂方法模式

设计模式-简单工厂工厂方法模式抽象工厂模式详解

工厂方法模式

[python实现设计模式]-3.简单工厂模式

工厂方法模式