工厂方法模式: 实例化对象不是用new,用工厂方法替代。将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
简单工厂模式: 用来生产同一等级架构中的任意产品(对于增加新的产品,需要修改已有代码)
在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例。
接下来创建一个接口,两个实现类,一个工厂,一个测试类
//创建手机接口
public interface Phone {
void name();
}
//创建华为实现类
public class HuaWei implements Phone{
@Override
public void name() {
System.out.println("华为手机");
}
}
//创建小米实现类
public class XiaoMi implements Phone{
@Override
public void name() {
System.out.println("小米手机");
}
}
//创建工厂
public class PhoneFactory {
public static Phone getPhone(String phone){
if(phone.equals("华为")){
return new HuaWei();
}else if(phone.equals("小米")){
return new XiaoMi();
}else {
return null;
}
}
}
//测试类
public class Consumer {
public static void main(String[] args) {
Phone p1= PhoneFactory.getPhone("华为");
Phone p2= PhoneFactory.getPhone("小米");
p1.name();
p2.name();
}
}
我们通过创建一个PhoneFactory类,成功的完成工厂的创建。我们在创建对象时,也就不需要直接创建对象,而是可以通过创建工厂,这样大大的降低了代码的耦合性。但是,静态工厂模式是不能添加数据的。比如说,我们想添加一个“Oppo”手机类,你不直接修改PhoneFactory工厂代码,是不能实现的。所以,就有了第二种的工厂方法模式。
工厂方法模式:用来生产同一等级架构中的固定产品,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。(支持增加任意产品)
//创建手机接口
public interface Phone {
void name();
}
//创建华为实现类
public class HuaWei implements Phone{
@Override
public void name() {
System.out.println("华为手机");
}
}
//创建手机工厂接口
public interface PhoneFactory {
Phone getPhone();
}
//创建华为工厂
public class HuaWeiFactory implements PhoneFactory{
@Override
public Phone getPhone() {
return new HuaWei();
}
}
//测试类
public class Consumer {
public static void main(String[] args) {
Phone phone = new HuaWeiFactory().getPhone();
phone.name();
}
}
得到测试结果
华为手机
我们创建了手机工厂接口PhoneFactory,再创建华为工厂HuaWeiFactory实现工厂,这样就可以通过HuaWeiFactory创建对象。增加新的具体工厂和产品族很方便,比如说,我们想要增加小米,只需要创建一个小米工厂XiaoMiFactory实现手机工厂接口PhoneFactory,合理的解决的简单工厂模式不能修改代码的缺点。但是,在现实使用中,简单工厂模式占绝大多数。