大话设计模式-工厂方法模式-2020-09-24

2020-09-28  本文已影响0人  勇往直前888

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

结构图

image.png

与简单工厂的区别

image.png

当然,类的个数增加了,显得繁琐;不过解耦的好处也是显而易见的。比如增加一种乘方运算,只要对应增加一个乘方工厂子类就可以了,不需要“修改”先前的代码。

雷锋工厂的例子

image.png
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();
    }
}

《大话设计模式》--工厂方法模式

image.png
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

上一篇 下一篇

猜你喜欢

热点阅读