工厂方法模式(Factory Pattern)
工厂方法模式(Factory Pattern),定义一个用于创建对象的接口,让子类决定具体实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
通俗的讲,新建实例对象交给一个特定的工厂类去完成,如果需要更换实例对象,只要替换掉工厂类就可以了。
我们想生产一个手机,假设可以有两种选择,一个是IPhone,一个是Huawei,这两种手机都具有手机的基本功能(实现了Phone接口)。
public interface Phone { void talk(); void playGames(); }
public class IPhone implements Phone { @Override public void talk() { System.out.println("balabala..."); } @Override public void playGames() { System.out.println("Play..."); } }
public class Huawei implements Phone { @Override public void talk() { System.out.println("打电话"); } @Override public void playGames() { System.out.println("玩游戏"); } }
现在开始建造这IPhone工厂和Huawei工厂,这两个工厂都实现了Factory接口,具有生产手机的能力
public interface PhoneFactory { Phone createPhone(); }
public class IPhoneFactory implements PhoneFactory { @Override public Phone createPhone() { return new IPhone(); } }
public class HuaweiFactory implements PhoneFactory { @Override public Phone createPhone() { return new Huawei(); } }
现在工厂已经建造好了,可以开始生产手机了
public static void main(String[] args) { //IFactory factory = new HuaweiFactory(); //生产华为手机的工厂 IFactory factory = new IPhoneFactory(); //只需要把工厂替换为IPhone手机工厂 ... //需要其他手机,只需要实例化其他手机工厂 //其余代码不需要更改 Phone phone = factory.createPhone(); phone.playGames(); phone.talk(); }
1,工厂方法模式完全符合“开-闭原则”,可扩展,不必修改之前的代码。
2,父类负责制定规则,子类负责具体实现,是很典型的模板方法模式。但是工厂方法模式用于生产实例,模板方法模式偏于子类实现具体逻辑。
3,新手学习时,不必纠结于父类是抽象类还是接口,使用抽象类还是接口,要看具体的业务。