工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法就是让类把实例化推迟到子类。
工厂方法模式与简单工厂模式的区别:
两者都实现了类的实例化与类的行为之间的解耦。如果需要添加需求,对于简单工厂来说需要修改工厂中的代码。未遵循开闭原则(对拓展开放,对修改关闭),工厂方法模式只需要写个类实现工厂接口,遵循开闭原则。
类图:
场景:
手机实例化(Phone)是需要手机工厂(PhoneFactory)来生产的,手机(Phone)需要有打电话(call())的功能,实现一个ICall接口。现在有2款手机,一款iPhone,一款小米,现在让我们用工厂方法模式怎么实现代码
手机(Phone)需要打电话功能,需要实现ICall接口
public interface ICall {
void call();
}
public abstract class Phone implements ICall {
}
手机工厂(PhoneFactory),创建手机(createPhone() 返回手机实例(Phone))
public interface PhoneFactory {
Phone createPhone();
}
现在有2款手机:iPhone和小米
public class IPhone extends Phone {
@Override
public void call() {
Log.e("zhang", "我用iPhone手机打电话");
}
}
public class XiaoMiPhone extends Phone {
@Override
public void call() {
Log.e("zhang", "我用小米手机打电话");
}
}
我们现在需要创建2个工厂去生产手机了
public class IPhoneFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
}
public class XiaoMiFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new IPhoneFactory().createPhone().call();
new XiaoMiFactory().createPhone().call();
}
}