Android中的设计模式-工厂方法模式

简单工厂&工厂方法

一直以来总是分不清简单工厂,工厂方法,抽象工厂这三个设计模式的区别,倒不是不理解其区别,而是总是记忆混淆,傻傻分不清楚,所以再重新总结一下区别,并记录下来,下次再混淆时,可以拿出来看看。这节先说简单工厂和工厂方法,下一节再说抽象工厂。

工厂方法中其实就包含了简单工厂,简单工厂也称为静态工厂方法,

简单工厂模式(Simple Factory)

类图

简单工厂模式又称为静态工厂方法模式,是工厂方法模式的一种,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。注意这里工厂类传入的参数,是工厂类新建产品的依据,可以是一个字符串,也可以是自己定义的Enum或者Int值。

以一个汽车工厂为例,可以生产3种不同类型的汽车,SUV,Sedan,MPV,每个汽车都有drive方法。如果不使用简单工厂而是直接创建的话,如下面的例子。

public class User {
    public static SUV suv;
    public static void main(String[] args) {
        suv=new SUV();
        suv.drive();
    }

}
class SUV{
    public void drive(){
        System.out.println("SUV is driving");
    }
}
class Sedan{
    public void drive(){
        System.out.println("Sedan is driving");
    }
}
class MPV{
    public void drive(){
        System.out.println("MPV is driving");
    }
}

乍看起来没问题,想要什么产品,那就直接新建一个就好了,不过问题在于,对于使用产品的类,只能持有对应产品的对象,例如上面的例子,我持有SUV的对象,然后新建SUV的对象,当有一天有了新的产品了,并且需要替换SUV。还需要修改使用的主体。这就使使用产品的主体和产品紧紧耦合在了一起。不利于代码的复用和拓展。

把上面的代码稍微修改一下,将所有车辆抽象为一个Vehicle接口,让User持有一个Vehicle对象,新建一个工厂类,根据传入的参数不同,返回不同的对象给User使用。并且工厂类创建产品的函数是静态的,这样就不需要先创建一个工厂类了。

代码:


interface Vehicle{
    public void drive();
}
class SUV implements Vehicle {
    @Override
    public void drive(){
        System.out.println("SUV is driving");
    }
}
class Sedan implements Vehicle{
    @Override
    public void drive() {
        System.out.println("Sedan is driving");
    }

}
class MPV implements Vehicle{
    @Override
    public void drive(){
        System.out.println("MPV is driving");
    }
}

enum VehcleType{
    suv,sedan,mpv
}
public class SimpleFactory {
    public static Vehicle makeVehicle(VehcleType type){
        switch(type){
        case suv:
            return new SUV();
        case sedan:
            return new Sedan();
        case mpv:
            return new MPV();
        default:
            break;
        }
        return null;

    }
}

测试代码:


public class User {
    public static Vehicle mVehicle;
    public static void main(String[] args) {
        mVehicle=SimpleFactory.makeVehicle(VehcleType.suv);
        mVehicle.drive();
    }

}

这样就好多了。不过有些情况还是不够好,比如:

当我需要生产一种新的车型,比如敞篷车 Convertible. 但是我在SimpleFactory.makeVehicle时,并没有这种车型,那就需要修改SimpleFactory类让它增加一个case判断,并新建一个Convertible对象。但是我们并不希望SimpleFactory这个工厂类开放给用户,也就造成了没办法去增加车型。 如何才能让User任意的增加车型呢? 这就扩展出了工厂方法模式

工厂方法模式(Factory Method)

继续上面的说,User可以只知道一个Vehicle接口对象和一个Factory接口对象,对于SUV来说它实现了Vehicle接口,同时也需要SUVFactory来实现Factory接口并创建它,这样对User来说,只需要创建一个SUVFactory对象,然后通过SUVFactory类创建一个SUV对象。 如果客户自己想增加一个Convertible产品。那只需要实现自己的Convertible类和ConvertibleFactory类。然后用同样的方式生产即可。

类图

代码:

车辆相关

public interface Vehicle {
    public void drive();
}
class SUV implements Vehicle {
    @Override
    public void drive(){
        System.out.println("SUV is driving");
    }
}
class Sedan implements Vehicle{
    @Override
    public void drive() {
        System.out.println("Sedan is driving");
    }

}
class MPV implements Vehicle{
    @Override
    public void drive(){
        System.out.println("MPV is driving");
    }
}

工厂相关

public interface Factory {
    public Vehicle makeVehicle();

}

class SUVFactory implements Factory{
    @Override
    public Vehicle makeVehicle() {

        return new SUV();
    }

}
class SedanFactory implements Factory{
    @Override
    public Vehicle makeVehicle() {

        return new Sedan();
    }

}
class MPVFactory implements Factory{
    @Override
    public Vehicle makeVehicle() {

        return new MPV();
    }

}

客户类:

public class User {

public static Vehicle mVehicle;

public static Factory mFactory;

public static void main(String[] args) {

mFactory=new SUVFactory();

mVehicle=mFactory.makeVehicle();

mVehicle.drive();

}

}

这时,我们想要改生产Convertible车辆,只需要增加Convertible和对应工厂,并修改客户类的实现即可:

class Convertible implements Vehicle{
    @Override
    public void drive(){
        System.out.println("Convertible is driving");
    }
}
class ConvertibleFactory implements Factory{
    @Override
    public Vehicle makeVehicle() {

        return new Convertible();
    }

}
public class User {
    public static Vehicle mVehicle;
    public static Factory mFactory;
    public static void main(String[] args) {
        mFactory=new ConvertibleFactory();
        mVehicle=mFactory.makeVehicle();
        mVehicle.drive();
    }

}

这时,生产出来的就是Convertible产品了。

设计模式的应用还是要根据其使用场景来决定,简单工厂升级为工厂方法,是因为需要封装工厂类,提供给客户类最大的自由和扩展性,但又对工厂的内部逻辑进行封装。

但不是说简单工厂就没有工厂方法好用,当客户类User本身也是内部封装的一部分,我们可以很方便的去修改工厂类,或者产品的增加可能很小,比如Phone,本来就只有GSMPhone,CDMAPhone,过了很久,突然出现了CDMALTEPhone,那也只需要在工厂类中增加这个类的生产即可。也许再出现一个新的XXXPhone也要几年之后了。

Android中的工厂方法

简单工厂

Android源码中有很多的工厂方法的使用,其中大多是静态工厂方法,也即是最开始说的简单工厂,前面也说过了,使用什么工厂是根据需求来看的,静态工厂方法是工厂方法的一个特例,虽然不似工厂方法那么灵活,但是对于很多不需要创建多个工厂来建造产品的情况下,静态工厂方法反而简单快捷。

例如BitmapFactory,通过public static Bitmap decodeFile(String pathName)静态方法,从文件中读取并新建Bitmap对象。

还比如Telephony中的PhoneFactory,通过public static void makeDefaultPhones(Context context) 静态方法创建,并通过PhoneFactory.getDefaultPhone()获取创建好的

还有NetworkStatsFactory,WebViewFactory这些都是简单工厂的应用。

除了Framework,很多系统应用也用到了工厂方法,就不一一列举了。

工厂方法

Java库中的ThreadFactory类作为抽象工厂,定义如下:

public interface ThreadFactory {
    Thread newThread(Runnable r);
}

Android中常用的AsyncTask,在其中就新建了一个具体的工厂(还有MMS应用中的BackgroundLoaderThreadFactory的实现,类似):

    private static final ThreadFactory  sThreadFactory = new ThreadFactory() {
        private final AtomicInteger mCount = new AtomicInteger(1);

        public Thread newThread(Runnable r) {
            return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
        }
    };

ThreadFactory的使用一般用在作为新建ThreadPoolExecutor的参数,在ThreadPoolExecutor中调用getThreadFactory().newThread()来新建一个工作线程,这里面Runnable可以理解为抽象产品,而Thread则是具体产品。

时间: 2024-10-24 23:04:28

Android中的设计模式-工厂方法模式的相关文章

Android设计模式——工厂方法模式(Factory Method)

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

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

4. 星际争霸之php设计模式--工厂方法模式

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

深入浅出设计模式——工厂方法模式(Factory Method)

介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我们继续来说"new"的问题,我们在简单工厂模式中,将实例化对象的工作推迟到了专门负责创建对象的工厂类中,这样,在我们事先预知的情况下,可以根据我们的需要动态创建产品类.但是,我们的预知是有限的,客户的变化可能是无限的.所以,就出现了问题,一旦客户的变化超越了我们的预知,我们就必须修改我们的

设计模式—工厂方法模式

工厂方法模式又叫多态性工厂(Polymorphic Factory)模式,工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 那么工厂方法模式是在什么场景下使用呢,下面就以本人的理解举例说明: 相信很多人都做过导入导出功能,就拿导出功能来说.有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML.CSV.PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便

php设计模式——工厂方法模式(Factory Method)

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

Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)

工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂模式(Polymorphic Factory). 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 那么工厂方法模式是在什么场景下使用呢?下面就举例说明: 相信很多人都做过导入导出功能,就拿导出功能来说.有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工