设计模式-工厂方法模式
1.工厂方法模式简介
工厂方法模式定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
2.工厂方法模式简单实现
创建抽象产品
电脑产品类,它有一个start方法用于启动电脑:
1 2 3
| public abstract class Computer{ public abstract void start(); }
|
创建具体产品
具体的电脑产品分别是联想、惠普和华硕电脑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class LenovoComputer extends Computer { @Override public void start() { System.out.println("联想电脑启动"); } } public class HpComputer extends Computer { @Override public void start() { System.out.println("惠普电脑启动"); } } public class AsusComputer extends Computer{ @Override public void start() { System.out.println("华硕电脑启动"); } }
|
创建抽象工厂
里面有一个createComputer方法,想生产哪个品牌的电脑就生产那个:
1 2 3
| public abstract class ComputerFactory { public abstract <T extends Computer> T createComputer(Class<T> clz); }
|
具体工厂
广达代工厂是一个具体的工厂,他继承抽象工厂,通过反射来生产不同厂家的电脑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class GDComputerFactor extends ComputerFactory { @Override public <T extends Computer> T createComputer(Class<T> clz) { Computer computer=null; String classname=clz.getName();
try { computer= (Computer) Class.forName(classname).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) computer; } }
|
客户端调用
1 2 3 4 5 6 7 8 9 10 11
| public class Client { public static void main(String[]args) { ComputerFactory computerFactory = new GDComputerFactor(); LenovoComputer mLenovoComputer=computerFactory.createComputer(LenovoComputer.class); mLenovoComputer.start(); HpComputer mHpComputer=computerFactory.createComputer(HpComputer.class); mHpComputer.start(); AsusComputer mAsusComputerr=computerFactory.createComputer(AsusComputer.class); mAsusComputerr.start(); } }
|
结构很简单
3.工厂方法与简单工厂
简单工厂模式我们都知道,在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类,对客户端来说,去除了与具体产品的依赖,与此同时也会带来一个问题:如果我们去增加产品,比如我们要生产苹果电脑,那我们就需要在工厂类中在添加一个Case分支条件,这违背了开放封闭原则,我们对修改也开放了。而工厂方法模式就没有违背这个开放封闭原则,如果我们需要生产苹果电脑,并不需要去修改工厂类,直接创建产品就好了。