设计模式-工厂方法模式[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版]的主要内容,如果未能解决你的问题,请参考以下文章