代码编写出来是为了给别人 (client) 调用的:ide
因此,为了简化代码的协做使用及管理维护,必须想尽办法简化代码逻辑,实现必要的分离。spa
好比说,有一系列的代码,是用来建立不一样品牌的手机。代码是这样的:3d
public class Iphone { public void mypg () {} } public class Huawei { public void myhwi () {} } public class Lennovo {} public class Xiaomi {} public class Vivo {}
若是这样的代码提供给客户端调用,那么提供者必需要将全部类的名称以及对应的方法暴露给客户端。code
客户端的调用示例以下:blog
Iphone pg = new Iphone(); phone1.mypg(); Huawei hw = new Huawei(); phone2.myhw();
这样的方式很是原始,也很简单,可是代码的逻辑不清晰,暴露的内容过多。接口
解决的方案:开发
为了减小方法调用的复杂度,也为了便于抽象跟代码管理,我们额外提供一个接口:源码
public interface Phone { void play(); }
而后,将全部手机类都实现 Phone 接口,将暴露给客户端调用的逻辑都封装在 play 方法里。产品
那么,客户端须要知道的调用 API 就减小到了两种:it
调用的逻辑就变简单了:
Phone phone1 = new Iphone(); phone1.play(); Phone phone2 = new Lianxiang(); phone2.play(); Phone phone3 = new Xiaomii(); phone3.play();
这种方式有缺点:
因此,天然产生了简单工厂的这种策略
在中间加一层:
public class PhoneFactory { public Phone createPhone(String tag) { if (tag.equals("lx")) { return new Lenovo(); } else if (tag.equals("pg")) { return new Iphone(); } else if (tag.equals("hw")) { return new Huawei(); } } }
客户端的调用:
PhoneFactory pf = new PhoneFactory(); pf.createPhone("hw").play(); pf.createPhone("pg").play(); pf.createPhone("xm").play();
简单工厂模式,自己已经为解耦合作出了很好的方案。可是它有缺点:
解决方案就是工厂方法模式
为 Phone 工厂,建立一个接口:
public interface GCIphoneFactory {
Phone createPhone();
}
若是增长了一款产品,好比是 iPhone,那么,只须要为 iPhone 建立一个工厂类就能够了:
public class IphoneFactory implements GCIphoneFactory { @Override public Phone createPhone() { return new IPhone(); } }
若是再增长另一款产品,好比 Huawei,那么只须要另一个工厂就能够了:
public class HuaweiFactory implements GCIphoneFactory { @Override public Phone createPhone() { return new Huawei(); } }
客户端的调用:
GCIphoneFactory gc = new HuaweiFactory(); gc.createPhone().play(); GCIphoneFactory pg = new IphoneFactory(); pg.createPhone().play();
工厂方法模式,是最标准的一种工厂模式,也是应用普遍的一种模式
可是工厂方法模式,有一个很大的缺点: