定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
结构图
image.png与简单工厂的区别
-
在产品一侧,两者是相同的:父类提供公共接口,子类完成具体工作;
-
在工厂一侧,简单工厂包含了业务逻辑,通过关键字,用case的方式区别不同的子类产品。如果要增加产品种类,就需要“修改”case逻辑,违反了“对修改关闭”的原则
-
所以工厂模式,也通过父类工厂提供公共接口,子类工厂创建特定子类的方式,消除掉case逻辑,达到“对修改关闭”的原则。
-
子类工厂解除了耦合,不过增加了类的个数。比如,计算器的例子。使用简单工厂,只要一个工厂类,然后通过一个字符(+-*/)就能确定子类。如果用工厂方法,那么就要提供加减乘除4个工厂子类。
当然,类的个数增加了,显得繁琐;不过解耦的好处也是显而易见的。比如增加一种乘方运算,只要对应增加一个乘方工厂子类就可以了,不需要“修改”先前的代码。
雷锋工厂的例子
- 结构图
- 产品父类LeiFeng,定义功能接口,或者是基础功能
class LeiFeng {
public String info;
public void sweep() {
Log.v("工厂方法模式", "学雷锋做好事======扫地");
info = "学雷锋做好事======扫地";
}
public void wash() {
Log.v("工厂方法模式", "学雷锋做好事======洗衣");
info = "学雷锋做好事======洗衣";
}
public void buyRice() {
Log.v("工厂方法模式", "学雷锋做好事======买米");
info = "学雷锋做好事======买米";
}
}
- 产品子类,实现具体的功能
class Student extends LeiFeng {
@Override
public void sweep() {
Log.v("工厂方法模式", "大学生======学雷锋做好事======扫地");
info = "大学生======学雷锋做好事======扫地";
}
@Override
public void wash() {
Log.v("工厂方法模式", "大学生======学雷锋做好事======洗衣");
info = "大学生======学雷锋做好事======洗衣";
}
@Override
public void buyRice() {
Log.v("工厂方法模式", "大学生======学雷锋做好事======买米");
info = "大学生======学雷锋做好事======买米";
}
}
class Volunteer extends LeiFeng {
@Override
public void sweep() {
Log.v("工厂方法模式", "社区志愿者======学雷锋做好事======扫地");
info = "社区志愿者======学雷锋做好事======扫地";
}
@Override
public void wash() {
Log.v("工厂方法模式", "社区志愿者======学雷锋做好事======洗衣");
info = "社区志愿者======学雷锋做好事======洗衣";
}
@Override
public void buyRice() {
Log.v("工厂方法模式", "社区志愿者======学雷锋做好事======买米");
info = "社区志愿者======学雷锋做好事======买米";
}
}
class Police extends LeiFeng {
@Override
public void sweep() {
Log.v("工厂方法模式", "警察======学雷锋做好事======扫地");
info = "警察======学雷锋做好事======扫地";
}
@Override
public void wash() {
Log.v("工厂方法模式", "警察======学雷锋做好事======洗衣");
info = "警察======学雷锋做好事======洗衣";
}
@Override
public void buyRice() {
Log.v("工厂方法模式", "警察======学雷锋做好事======买米");
info = "警察======学雷锋做好事======买米";
}
}
- 工厂接口,定义创建产品的接口
interface IFactory {
LeiFeng createLeiFeng();
}
- 具体工厂类,创建各个具体的产品
class StudentFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Student();
}
}
class VolunteerFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Volunteer();
}
}
class PoliceFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Police();
}
}
- 测试界面
- 测试代码
public class FactoryActivity extends AppCompatActivity {
LeiFeng leiFeng;
IFactory factory;
RadioButton radioButtonStudent;
RadioButton radioButtonVolunteer;
RadioButton radioButtonPolice;
TextView textViewInfo;
public static void launch(Context context) {
if (null != context) {
Intent intent = new Intent();
intent.setClass(context, FactoryActivity.class);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_factory);
setTitle("工厂方法模式");
radioButtonStudent = findViewById(R.id.radioButtonStudent);
radioButtonVolunteer = findViewById(R.id.radioButtonVolunteer);
radioButtonPolice = findViewById(R.id.radioButtonPolice);
textViewInfo = findViewById(R.id.textViewInfo);
}
public void onSweepClick(View view) {
buildProduct();
leiFeng.sweep();
textViewInfo.setText(leiFeng.info);
}
public void onWashClick(View view) {
buildProduct();
leiFeng.wash();
textViewInfo.setText(leiFeng.info);
}
public void onBuyRiceClick(View view) {
buildProduct();
leiFeng.buyRice();
textViewInfo.setText(leiFeng.info);
}
private void buildProduct() {
if (radioButtonStudent.isChecked()) {
factory = new StudentFactory();
} else if (radioButtonVolunteer.isChecked()) {
factory = new VolunteerFactory();
} else if (radioButtonPolice.isChecked()) {
factory = new PoliceFactory();
} else {
// 啥也不干
}
if (null != factory) {
leiFeng = factory.createLeiFeng();
}
}
}
Demo地址
https://gitee.com/zhangxusong888/Android/tree/master/design_pattern
网友评论