美文网首页
设计模式之抽象工厂模式

设计模式之抽象工厂模式

作者: Kevin_小飞象 | 来源:发表于2019-04-03 14:36 被阅读0次

定义

为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体实现类。

Android 源码中使用抽象工厂模式

MediaPlayer

特点

  • 优点:
    分离接口与实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现分离,使抽象该工厂方法模式在切换产品类时更加灵活、容易。

  • 缺点:
    一是对类文件的爆炸性增加,二是不太容易扩展新的产品类。

使用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体,但是 Linux 下的文本编辑器和 Windows 下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况,也就是具有了共同的约束条件:操作系统类型,于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

简单实现

以车厂生产汽车零部件为例,A、B两家车厂分别生产不同的轮胎、发动机、制动系统。虽然生产的零件不同,型号不同。但是根本上都有共同的约束,就是轮胎、发动机、制动系统。
轮胎相关类:

public interface ITire {
    void tire();
}

---------------------------
public class NormalTire implements ITire {
    @Override
    public void tire() {
        Log.d("TAG", "普通轮胎");
    }
}

---------------------------
public class SUVTire implements ITire {
    @Override
    public void tire() {
        Log.d("TAG", "SUV轮胎");
    }
}

引擎相关类:

public interface IEngine {
    void engine();
}

---------------------------
public class DomesticEngine implements IEngine {
    @Override
    public void engine() {
        Log.d("TAG", "国产发动机 ");
    }
}

---------------------------
public class ImportEngine implements IEngine {
    @Override
    public void engine() {
        Log.d("TAG", "进口发动机 ");
    }
}

制动相关类:

public interface IBrake {
    void brake();
}

---------------------------
public class NormalBrake implements IBrake {
    @Override
    public void brake() {
        Log.d("TAG", "普通制动");
    }
}

---------------------------
public class SeniorBrake implements IBrake {
    @Override
    public void brake() {
        Log.d("TAG", "高级制动");
    }
}

工厂相关类:

public abstract class CarFactory {
    public abstract ITire createTire();

    public abstract IEngine createEngine();

    public abstract IBrake createBrake();
}

---------------------------
public class AFactory extends CarFactory {
    @Override
    public ITire createTire() {
        return new NormalTire();
    }

    @Override
    public IEngine createEngine() {
        return new DomesticEngine();
    }

    @Override
    public IBrake createBrake() {
        return new NormalBrake();
    }
}

---------------------------
public class BFactory extends CarFactory {
    @Override
    public ITire createTire() {
        return new SUVTire();
    }

    @Override
    public IEngine createEngine() {
        return new ImportEngine();
    }

    @Override
    public IBrake createBrake() {
        return new SeniorBrake();
    }
}

使用:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
    }

    private void initData() {
        CarFactory factoryA = new AFactory();
        factoryA.createTire().tire();
        factoryA.createEngine().engine();
        factoryA.createBrake().brake();

        Log.d("TAG", "-------------");

        CarFactory factoryB = new BFactory();
        factoryB.createTire().tire();
        factoryB.createEngine().engine();
        factoryB.createBrake().brake();
    }
}

结果:

2019-04-03 14:26:07  普通轮胎
2019-04-03 14:26:07  国产发动机 
2019-04-03 14:26:07  普通制动
2019-04-03 14:26:07  -------------
2019-04-03 14:26:07  SUV轮胎
2019-04-03 14:26:07  进口发动机 
2019-04-03 14:26:07  高级制动

相关文章

网友评论

      本文标题:设计模式之抽象工厂模式

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