美文网首页
大话设计模式-工厂方法模式-2020-09-24

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

作者: 勇往直前888 | 来源:发表于2020-09-28 09:58 被阅读0次

    定义

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

    结构图

    image.png

    与简单工厂的区别

    • 在产品一侧,两者是相同的:父类提供公共接口,子类完成具体工作;

    • 在工厂一侧,简单工厂包含了业务逻辑,通过关键字,用case的方式区别不同的子类产品。如果要增加产品种类,就需要“修改”case逻辑,违反了“对修改关闭”的原则

    • 所以工厂模式,也通过父类工厂提供公共接口,子类工厂创建特定子类的方式,消除掉case逻辑,达到“对修改关闭”的原则。

    • 子类工厂解除了耦合,不过增加了类的个数。比如,计算器的例子。使用简单工厂,只要一个工厂类,然后通过一个字符(+-*/)就能确定子类。如果用工厂方法,那么就要提供加减乘除4个工厂子类。

    image.png

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

    雷锋工厂的例子

    • 结构图
    image.png
    • 产品父类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();
        }
    }
    

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

    • 测试界面
    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

    相关文章

      网友评论

          本文标题:大话设计模式-工厂方法模式-2020-09-24

          本文链接:https://www.haomeiwen.com/subject/qzgzyktx.html