提出问题
简单工厂的缺点:当新增加一个商品时,就需要修改工厂类,如何避免?
分析
使用 工厂方法模式
工厂方法模式
创建一个工厂接口,创建多个工厂实现类,每个工厂只生成 一类/一种 商品
优点
当需要 生成一个新商品时,直接 增加 新的工厂实现类 就可以了,不需要修改其他的代码
符合开放-封闭原则
缺点
对于某些可以形成产品族(一组产品)的情况,生产这类商品比较复杂。
案例
定义“产品”接口:
public interface InterPhone {
public void call(String num);
public void about();
}
定义若干 “产品”接口实现类
class IPhone implements InterPhone{
String name;
String cpu;
int rom;
int ram;
int battery;
@Override
public void call(String num) {
System.out.println("用iphone打电话给 "+num);
}
@Override
public void about() {
System.out.println("配置是:");
System.out.println("name:"+name);
System.out.println("cpu:"+cpu);
System.out.println("rom:"+rom);
System.out.println("ram:"+ram);
System.out.println("battery:"+battery);
}
}
class MiPhone implements InterPhone{
String name;
String cpu;
int rom;
int ram;
int battery;
@Override
public void call(String num) {
System.out.println("用小米打电话给 "+num);
}
@Override
public void about() {
System.out.println("配置是:");
System.out.println("name:"+name);
System.out.println("cpu:"+cpu);
System.out.println("rom:"+rom);
System.out.println("ram:"+ram);
System.out.println("battery:"+battery);
}
}
定义工厂接口
public interface InterPhoneFactory {
InterPhone create();
}
定义生产iphone的工厂实现类
当生成一种新商品时,如:iphone11,就创建相应的工厂实现类
public class IPhoneFactory implements InterPhoneFactory {
@Override
public InterPhone create() {
IPhone phone = new IPhone();
phone.name="iphone11";
phone.cpu="A13";
phone.rom=64;
phone.ram=2;
phone.battery=3000;
return phone;
}
}
定义生产小米的工厂实现类
当生成一种新商品时,如:小米9,就创建相应的工厂实现类
public class MiPhoneFactory implements InterPhoneFactory {
@Override
public InterPhone create() {
MiPhone phone = new MiPhone();
phone.name="小米9";
phone.cpu="骁龙855";
phone.rom=256;
phone.ram=16;
phone.battery=5000;
return phone;
}
}
测试
public class Main {
public static void main(String[] args) {
// 创建IPhone 工厂
InterPhoneFactory iPhoneFactory = new IPhoneFactory();
// 通过 IPhone 工厂生成手机
InterPhone iphone11 = iPhoneFactory.create();
iphone11.about();
System.out.println("------------");
// 创建IPhone 工厂
InterPhoneFactory miFactory = new MiPhoneFactory();
// 通过 miFactory 工厂生成手机
InterPhone miPhone9 = miFactory.create();
miPhone9.about();
}
}
优缺点
好处
遵循开闭原则,创建新商品时,不需要修改原来的代码
缺点
创建产品族(一组产品 或 一系列产品,如:iphone充电器、iphone保护膜、iphone手机壳,小米充电器、小米保护膜、小米手机壳等),需要定义非常多的工厂
参考:
https://www.cnblogs.com/geek6/p/3951677.html