Android中的设计模式-抽象工厂模式

抽象工厂模式(Abstract Factory)

先上类图吧,自己懒得画了,找了个现成的

抽象工厂的引入是根据需求而产生的,说到这里先要提到一个名字—产品族(Product Family),还是以生产汽车为例,我想要一个上汽的汽车工厂能够同时生产一款MPV,一款SUV和一款Sedan,那比如说它就是上海通用别克的工厂啦,可以生产MPV GL8,生产SUV 昂科威,可以生产Sedan 君威,这几款产品就算是一个产品族。作为公司高层,肯定是希望工厂能够有能力同时生产这三款车,将这个工程抽象出来,就成了这个样子:

public interface AbstractFactory {
    public SUV makeSUV();
    public MPV makeMPV();
    public Sedan makeSedan();
}

不过这个例子并不好,因为这里的三种车辆还是属于车辆,而产品族,是指不同的产品,这里还是换一个例子来说明吧。

生产一个SUV,需要生产不同的零件,如轮胎,方向盘,发动机。该款SUV上的Tyre, SteeringWheel和Engine,则属于一个产品族,一个SUV对象需要Tyre, SteeringWheel和Engine的实例才能正常工作。如果在SUV的类中,直接调用新建三种对象,当然是没有问题的。问题出在,如果换一款SUV,轮胎,方向盘,发动机都变了,那我们就得重新新建TyreB, SteeringWheelB和EngineB. 为了让SUV更加通用,可以抽象出Tyre, SteeringWheel和Engine三个接口,然后实现不同的Tyre, SteeringWheel和Engine产品。 同时针对SUVA和SUVB两种SUV。创建一个Creater接口,接口中定义了创建3中产品的方法。而在Creater接口的具体实现类中,则实现三种产品不同型号的创建。

我们抽象出来的类图如下所示:

类图

代码:

三种产品

interface Tyre {
    public void Roll();
}

class TyreA implements Tyre{
    @Override
    public void Roll() {
            System.out.println("I am TyreA ,I am Big");
    }

}
class TyreB implements Tyre{
    @Override
    public void Roll() {
        System.out.println("I am TyreB ,I am Small");
    }

}

interface SteeringWheel{
    public void Turn();
}

class SteeringWheelA implements SteeringWheel{
    @Override
    public void Turn() {
        System.out.println("I am SteeringWheelA ,I am Big");
    }

}
class SteeringWheelB implements SteeringWheel{
    @Override
    public void Turn() {
        System.out.println("I am SteeringWheelB ,I am Small");
    }

}
interface Engine{
    public void Roar();
}

class EngineA implements Engine{
    @Override
    public void Roar() {
        System.out.println("I am EngineA ,I am 3.0Turbo ");
    }
}

class EngineB implements Engine{
    @Override
    public void Roar() {
        System.out.println("I am EngineB ,I am 1.6L ");
    }
}

两个工厂


public interface AbstractFactory {
    public Tyre createTyre();
    public SteeringWheel createSteeringWheel();
    public Engine createEnginen();
}

class SUVFactory1 implements AbstractFactory{

    @Override
    public Tyre createTyre() {
        return new TyreA();
    }

    @Override
    public SteeringWheel createSteeringWheel() {
        return new SteeringWheelA();
    }

    @Override
    public Engine createEnginen() {
        return new EngineA();
    }

}

class SUVFactory2 implements AbstractFactory{

    @Override
    public Tyre createTyre() {
        return new TyreB();
    }

    @Override
    public SteeringWheel createSteeringWheel() {
        return new SteeringWheelB();
    }

    @Override
    public Engine createEnginen() {
        return new EngineB();
    }

}

使用工厂1创建的SUV

public class SUV {
    public Tyre mTyre;
    public SteeringWheel mSteeringWheel;
    public Engine mEngine;
    public AbstractFactory mFactory;
    public SUV() {
        mFactory=new SUVFactory1();
        mTyre=mFactory.createTyre();
        mSteeringWheel=mFactory.createSteeringWheel();
        mEngine=mFactory.createEnginen();
    }

    public void show(){
        mTyre.Roll();
        mSteeringWheel.Turn();
        mEngine.Roar();
    }
}

测试类

public class Host {

    public static void main(String[] args) {
        SUV mSUV=new SUV();
        mSUV.show();
    }

}

输出:

I am TyreA ,I am Big
I am SteeringWheelA ,I am Big
I am EngineA ,I am 3.0Turbo 

这时如果需要创建另一款SmallSUV车型,只需要创建另一个SmallSUV类,并新建第二个工厂,生产另外小型号的三种产品。

public class SmallSUV {
    public Tyre mTyre;
    public SteeringWheel mSteeringWheel;
    public Engine mEngine;
    public AbstractFactory mFactory;
    public SmallSUV() {
        mFactory=new SUVFactory2();
        mTyre=mFactory.createTyre();
        mSteeringWheel=mFactory.createSteeringWheel();
        mEngine=mFactory.createEnginen();
    }
    public void show(){
        mTyre.Roll();
        mSteeringWheel.Turn();
        mEngine.Roar();
    }
}

测试类

public class Host {
    public static void main(String[] args) {
        SmallSUV mSUV=new SmallSUV();
        mSUV.show();
    }
}

输出

I am TyreB ,I am Small
I am SteeringWheelB ,I am Small
I am EngineB ,I am 1.6L 

Android中的抽象工厂

暂时没遇到,欢迎知道的童鞋告知在下,先行谢过。

时间: 2024-10-13 14:43:38

Android中的设计模式-抽象工厂模式的相关文章

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

Java研究之学习设计模式-抽象工厂模式详解

 简介:          当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品.抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化.每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.(摘自百度百科) 话语说得太抽象,程序员最好的表示方式

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

5. 星际争霸之php设计模式--抽象工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248178.html============================================

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

JAVA设计模式--抽象工厂模式

抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关的代码.由应用程序调用以创建对应的具体产品的对象.在java中它由具体的类来实现.抽象产品角色:它是具体产品继承的父类或者是实现的接口.在java中一般