美文网首页
大话设计模式-工厂方法模式-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

相关文章

  • 大话设计模式之_工厂模式

    大话设计模式之_工厂模式 工程方法(即简单工厂模式simpleFactory,或静态工厂方法 static fac...

  • 代码段简单学习设计模式 -- 抽象工厂模式

    《JAVA与模式》之抽象工厂模式 大话设计模式 抽象工厂模式(Abstraci Factory): 提供一个创...

  • iOS开发之设计模式 - 工厂模式

    由《大话设计模式 - 工厂模式》的OC和部分Swift的语言转义 工厂模式 继上一篇《代理模式》 工厂模式, 定义...

  • Design Patterns Talk - Factory M

    《大话设计模式》第 8 章 - 工厂方法模式 的 Swift 实现。 问题 通过增加工厂方法的子类为新增的运算类生...

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

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

  • 工厂模式(Factory Pattern)

    大话设计模式之陈狗养猪记_工厂模式 概念: 工厂模式(Factory Pattern)是 Java 中最常用的...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

网友评论

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

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