上篇的话我们简单介绍了简单工厂模式。
这篇的话是介绍工厂模式。
首先我们还是来了解一下工厂模式的定义。
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
IProduct:抽象产品类。
Product:具体产品类,继承IProduct或实现IProduct接口。
Factory:抽象工厂类,该方法返回一个IProduct类型的对象。
ConcreteFactory:具体工厂类,返回Product实例。
工厂模式的抽象产品类和具体产品类跟之前简单工厂模式的实现是一样的,这里就不再赘述。我们看看代码
如何实现。
抽象产品类:
public abstract class Phone {
/**
* 产品的抽象方法,由具体的产品类实现
*/
public abstract void boot();
}
具体产品类:
public class XiaoMiPhone extends Phone{
@Override
public void boot() {
Log.e("TAG","小米手机启动");
}
}
public class HuaweiPhone extends Phone{
@Override
public void boot() {
Log.e("TAG","华为手机启动");
}
}
public class IPhone extends Phone{
@Override
public void boot() {
Log.e("TAG","苹果手机启动");
}
}
创建抽象工厂,抽象工厂里面有CreatePhone方法,想生产哪个品牌的手机就传入哪个手机的实现类。
public abstract class PhoneFactory{
public abstract <T extends Phone> T createPhone(Class<T> clz);
}
具体工厂,富士康代工厂是一个具体的代工厂,其继承抽象工厂,然后通过反射来生产不同品牌的手机。
public class FOXCPhoneFactory extends PhoneFactoty{
@Override
public <T extends Phone> T createPhone(Class<T> clz){
Phone phone = null;
String className = clz.getName();
try {
phone = (Phone)Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return (T)phone;
}
}
接下来我们看看客户端如何去使用:
客户端创建了富士康代工厂,并分别生产了小米、华为、苹果的手机。
public class Client{
public static void main(String[] args){
PhoneFactoty phoneFactoty = new FOXCPhoneFactory();
XiaoMiPhone xiaoMiPhone = phoneFactoty.createPhone(XiaoMiPhone.class);
xiaoMiPhone.boot();
HuaweiPhone huaweiPhone = phoneFactoty.createPhone(HuaweiPhone.class);
huaweiPhone.boot();
IPhone iPhone = phoneFactoty.createPhone(IPhone.class);
iPhone.boot();
}
}
我这里简单说一下我自己对于简单工厂模式和工厂模式直接的区别:
对于简单工厂模式,我们都知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的
产品,对于客户端来说,这去除了与具体产品的依赖,但与此同时也会带来一个问题:如果我们要增加产品,
比如我们要生产oppo手机,就需要在工厂类中增加一个case分支条件,这违背了开放封闭原则,对修改也开
放了。而工厂方法模式就没有违背这个开发封闭的原则。如果我们需要生产oppo手机,则无须修改工厂类,
直接创建产品即可。
再累再苦,只当自己是二百五,再艰再险,只当自己是二皮脸。与君共勉~