android 工厂方法模式应用场景,Android编程设计模式之工厂方法模式实例详解

本文详细介绍了Android编程中的工厂方法模式,包括模式定义、使用场景、简单实现以及在Android源码中的应用。通过实例展示了如何创建抽象产品类、具体产品类、抽象工厂类和具体工厂类,以及如何在客户端使用工厂方法创建对象。此外,还讨论了工厂方法模式的优点和缺点,以及在实际开发中的扩展性。文章最后提到了Activity生命周期方法作为工厂方法的实例,并探讨了反射在工厂模式中的应用。
摘要由CSDN通过智能技术生成

本文实例讲述了Android编程设计模式之工厂方法模式。分享给大家供大家参考,具体如下:

一、介绍

工厂方法模式(Factory Pattern),是创建型设计模式之一。工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如Android中的Activity里的各个生命周期方法,以onCreate方法为例,它就可以看作是一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给framework处理等,相关内容我们下面再讲,先看看工厂方法模式定义。

二、定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。

三、使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

四、模式的简单实现

抽象产品类:

public abstract class Product {

/**

* 产品类的抽象方法

* 由具体的产品类去实现

* */

public abstract void method();

}

具体产品类A:

public class ConcreteProductA extends Product {

@Override

public void method() {

System.out.println("我是具体的产品A");

}

}

具体产品类B:

public class ConcreteProductB extends Product {

@Override

public void method() {

System.out.println("我是具体的产品B");

}

}

抽象工厂类:

public abstract class Factory {

/**

* 抽象工厂方法

* 具体由子类实现

*

* @return 具体的产品对象

* */

public abstract Product createProduct();

}

具体工厂类:

public class ConcreteFactory extends Factory {

/**

* 具体工厂类

* */

@Override

public Product createProduct() {

return new ConcreteProductA();

}

}

客户类:

public class Client {

public static void main(String[] args) {

Factory factory = new ConcreteFactory();

Product product = factory.createProduct();

product.method();

}

}

结果:

我是具体的产品A

这里的几个角色都很简单,主要分为四大模块,一是抽象工厂,其为工厂方法模式的核心;二是具体工厂,其实现了具体的业务逻辑;三是抽象产品,是工厂方法模式所创建的产品的父类;四是具体产品,为实现抽象产品的某个具体产品的对象。

上述的代码中我们在Client类中构造了一个工厂对象,并通过其生产了一个产品对象,这里我们得到的产品对象是ConcreteProductA的实例,如果想得到ConcreteProductB的实例,更改ConcreteFactory中的逻辑即可:

public class ConcreteFactory extends Factory {

/**

* 具体工厂类

* */

@Override

public Product createProduct() {

//return new ConcreteProductA();

return new ConcreteProductB();

}

}

这种方式比较常见,需要哪一个产品就生产哪一个,有时候也可以利用反射的方式更简洁的来生产具体产品对象,此时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类:

public abstract class Factory {

/**

* 抽象工厂方法

* 具体由子类实现

*

* @param clz 产品对象类类型

*

* @return 具体的产品对象

* */

public abstract T createProduct(Class clz);

}

对于具体的工厂类,则通过反射获取类的示例即可:

public class ConcreteFactory extends Factory {

/**

* 具体工厂类

* */

@SuppressWarnings("unchecked")

@Override

public T createProduct(Class clz) {

Product product = null;

try {

product = (Product) Class.forName(clz.getName()).newInstance();

} catch (Exception e) {

e.printStackTrace();

}

return (T)product;

}

}

最后在看看Client中的实现:

public class Client {

public static void main(String[] args) {

Factory factory = new ConcreteFactory();

Product product = factory.createProduct(ConcreteProductB.class);

product.method();

}

}

需要哪一个类的对象就传入哪一个类的类型即可,这种方法比较简洁、动态,如果你不喜欢这种方式,也可以尝试为每一个产品都定义一个具体的工厂,各司其职。

public class ConcreteFactoryA extends Factory {

/**

* 具体工厂类

**/

@Override

public Product createProduct() {

return new ConcreteProductA();

}

}

public class ConcreteFactoryB extends Factory {

/**

* 具体工厂类

**/

@Override

public Product createProduct() {

return new ConcreteProductB();

}

}

public class Client {

public static void main(String[] args) {

Factory factoryA = new ConcreteFactoryA();

Product productA = factoryA.createProduct();

productA.method();

Factory factoryB = new ConcreteFactoryB();

Product productB = factoryB.createProduct();

productB.method();

}

}

像这样拥有多个工厂的方式我们称为多工厂方法模式,同样的,回到我们最初的那个工厂方法模式,当我们的工厂只有一个的时候,我们还是为工厂提供了一个抽象类,那么,我们是否可以将其简化掉呢?如果确定你的工厂类只有一个,那么简化掉抽象类是肯定没问题的,我们只需要将对应的工厂方法改为静态方法即可:

public class Factory {

/**

* 具体工厂类

**/

@Override

public static Product createProduct() {

return new ConcreteProductA();

}

}

像这样的方式又称为简单工厂模式或静态工厂模式,它是工厂方法模式的一个弱化版本。

其实到这里大家应该可以发现,工厂方法模式是完全符合设计原则的,其降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。

五、Android源码中的工厂方法模式

Activity的各种生命周期

ArrayList和HashSet

六、总结

优点:

工厂方法模式完全符合设计原则,降低了对象之间的耦合。高层模块只需要知道产品的抽象类,其他的实现都不需要关心。

良好的封装性,代码结构清晰。扩展性好。

缺点:

每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类。同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要设计者权衡利弊了。

希望本文所述对大家Android程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值