项目中使用工厂模式到底有啥好处?
源 / 文/ 王小五
简单工厂模式
实际案例
Phone
,里面有一个玩游戏的方法play()
。Huwei
和Xiaomi
,这两个手机类要遵循手机只能用来玩游戏
这个规范,所以它们要实现Phone
类,并完成play()
方法phone
基类public interface Phone {
void play();
}
Huawei
public class Huawei implements Phone {
@Override
public void play() {
System.out.println("华为手机玩游戏");
}
}
Xiaomi
public class Xiaomi implements Phone {
@Override
public void play() {
System.out.println("小米手机玩游戏");
}
}
Jingdong
和Taobao
。类里面各有一个订购方法叫做order()
,可以根据用户的喜好来订购不同的手机public class Jingdong {
public void order(String type) {
Phone phone = null;
if ("huawei".equals(type)) {
phone = new Huawei();
phone.play();
} else if ("xiaomi".equals(type)) {
phone = new Xiaomi();
phone.play();
} else {
System.out.println("暂不支持");
}
}
}
IPhone
,并且实现Phone
基类PhoneFactory
用代码实现就是这样public class PhoneFactory {
public static Phone createPhone(String type) {
Phone phone = null;
if ("huawei".equals(type)) {
phone = new Huawei();
} else if ("xiaomi".equals(type)) {
phone = new Xiaomi();
} else if ("apple".equals(type)) {
phone = new IPhone();
} else {
System.out.println("暂不支持");
}
return phone;
}
}
public class Jingdong {
public void order(String type) {
Phone phone = PhoneFactory.createPhone(type);
if (phone != null) {
phone.play();
}
}
}
简单工厂模式总结
开闭原则
。而且当具体的产品比较多时,工厂类的if-else
判断就会比较多,代码不美观工厂方法模式
实际案例
PhoneFactory
用代码实现public interface PhoneFactory {
Phone createPhone();
}
public class HuaweiFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new Huawei();
}
}
public class XiaomiFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new Xiaomi();
}
}
public class Jingdong {
// 华为粉丝订购华为手机
public void orderHuawei() {
PhoneFactory phoneFactory = new HuaweiFactory();
Phone phone = phoneFactory.createPhone();
phone.play();
}
// 小米粉丝订购小米手机
public void orderXiaomi() {
PhoneFactory phoneFactory = new XiaomiFactory();
Phone phone = phoneFactory.createPhone();
phone.play();
}
}
工厂方法模式总结
开闭原则
,在新增产品时不需要再改动已存在的代码,使工厂类和产品类的代码完全解耦,更利于程序的扩展抽象工厂模式
实际案例
Factory
基类实现代码如下public interface Factory {
Phone createPhone();
IPad createIPad();
PC createPC();
}
public class HuaweiFactory implements Factory {
@Override
public Phone createPhone() {
return new HuaweiPhone();
}
@Override
public IPad createIPad() {
return new HuaweiIPad();
}
@Override
public PC createPC() {
return new HuaweiPC();
}
}
public class XiaomiFactory implements Factory {
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
@Override
public IPad createIPad() {
return new XiaomiIPad();
}
@Override
public PC createPC() {
return new XiaomiPC();
}
}
public class Jingdong {
// 华为粉丝订购手机、ipad、电脑
public void orderHuawei() {
Factory factory = new HuaweiFactory();
Phone phone = factory.createPhone();
phone.play();
IPad ipad = factory.createIPad();
ipad.play();
PC pc = factory.createPC();
pc.play();
}
// 小米粉丝订购手机、ipad、电脑
public void orderXiaomi() {
Factory factory = new XiaomiFactory();
Phone phone = factory.createPhone();
phone.play();
IPad ipad = factory.createIPad();
ipad.play();
PC pc = factory.createPC();
pc.play();
}
}
抽象工厂模式总结
推荐阅读
7轮面试,耗费30天,我真的差点没挺过去...
迄今为止程序员写过的最大Bug:亏损30亿、致6人死亡,甚至差点毁灭世界
某程序员自述:我,三十多岁,逃离北上广,通过技术移民到加拿大!
END
顶级程序员:topcoding
做最好的程序员社区:Java后端开发、Python、大数据、AI
一键三连「分享」、「点赞」和「在看」
评论