设计模式 - 工厂模式

80 阅读3分钟

设计模式分为三种类型,共23种

  • 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
  • 结构型模式:代理模式、装饰模式、外观模式、享元模式、桥接模式、组合模式、适配器模式
  • 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式

经过设计之禅这本书籍的学习之后,又观察多篇博文,总结一片自认为通俗易懂的工厂模式知识整理

从第一眼到现在,我终究认为工厂模式的存在,就在于快速返回我们的需要的实体类,而我们需要的实体类方法,均在对应的实体类内部实现

请进入快速学习阶段,留出几个小时边喝茶,边读,边思考 ~

常见的工厂模式主要俩种,一为简单工厂模式,二为抽象工厂模式,这里我们先学习简单工厂模式,打一打基础 ~

作用:通过工厂类,统一出口,快速返回需求实体类,从而调用对应类的方法

优点:使用便捷,方便管理,扩展性强

角色划分:抽象产品类、具体产品类、工厂管理类

个人理解:工厂模式主要是统一出口,具体实现主要在具体产品类

基础版

主要是开阔思维,奠定自身基础,其角色划分也相对较少,主要分为具体产品类、工厂管理类

具体产品类

package com.example.yongliu.factorypattern;

import android.util.Log;

/**
 * author  yongliu
 * date  2017/12/25.
 * desc:
 */

public class Answer {
    public static void answer(){
        Log.e("tag","当然是我啦!");
    }
}

工厂管理类

package com.example.yongliu.factorypattern;

/**
 * author  yongliu
 * date  2017/12/25.
 * desc:
 */

public class QuestionFactory {

    public static Answer createAnswer(){
        return new Answer();
    }
}

使用方式

     mAnswer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            	//创建工厂类
                QuestionFactory questionFactory = new QuestionFactory();
                //通过工厂类创建具体产品类
                Answer answer = questionFactory.createAnswer();
                answer.answer();
            }
        });

输出结果
这里写图片描述


项目版

在项目中更实用且常见的还是这个版本,我们将共性产品类通过继承抽象产品类的方式实现了二次封装

角色划分

  1. 抽象产品类(基类 接口类)
  2. 具体产品类(一般可以有多个)
  3. 工厂管理类(统一出口)

抽象产品类(继承基类方式)- Parent

package com.example.yongliu.factorypattern;

import android.util.Log;

/**
 * author  yongliu
 * date  2017/12/23.
 * desc:
 */

public abstract class Parent {
    void gender(){
        Log.e("tag","性别:男性");
    }

    abstract void talk();

    abstract void job();
}

具体产品类

  • Father
package com.example.yongliu.factorypattern;

import android.util.Log;

/**
 * author  yongliu
 * date  2017/12/23.
 * desc:
 */

public class Farther extends Parent {
    @Override
    void talk() {
        Log.e("tag","老爸说的中文");
    }

    @Override
    void job() {
        Log.e("tag","老爸的职业是老师");
    }

    @Override
    void gender() {
        super.gender();
    }
}
  • Uncle
package com.example.yongliu.factorypattern;

import android.util.Log;

/**
 * author  yongliu
 * date  2017/12/23.
 * desc:
 */

public class Uncle extends Parent {
    @Override
    void talk() {
        Log.e("tag","叔叔说的英文");
    }

    @Override
    void job() {
        Log.e("tag","叔叔的工作是保安");
    }

    @Override
    void gender() {
        Log.e("tag","在Uncle类重写性别的方法,告诉大家叔叔也是男性");
    }
}

工厂管理类 - PeopleFactory

package com.example.yongliu.factorypattern;

/**
 * author  yongliu
 * date  2017/12/23.
 * desc:
 */

public class PeopleFactory {

    public  static Parent createFather(){
        return new Farther();
    }

    public static Parent createUncle(){
        return new Uncle();
    }

    public static Parent createYouLike(int tag){
        if(tag ==0){
            return new Farther();
        }else{
            return new Uncle();
        }
    }
}

使用方式

MainActivity

package com.example.yongliu.factorypattern;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView mFather;
    private TextView mUncle;
    private PeopleFactory peopleFactory;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //创建工厂
        peopleFactory = new PeopleFactory();

        mFather = findViewById(R.id.tv_father);
        mUncle = findViewById(R.id.tv_uncle);

        mFather.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Father类的数据    说中文  当老师 男性
                Parent father = peopleFactory.createFather();
                father.talk();
                father.job();
                father.job();
                father.gender();
            }
        });

        mUncle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Uncle类的数据   说英文,当保安 男性
                Parent uncle = peopleFactory.createUncle();
                uncle.talk();
                uncle.job();
                uncle.gender();
            }
        });

        //根据传值,创建对应的类
        // peopleFactory.createYouLike()
    }
}

输出结果

图1:示
Father输出结果
图2:示
Uncle输出结果