工厂模式

介绍

创建型设计模式,使用非常广泛。例如Activity里面的生命周期方法都可以看作是工厂方法。

创建型设计模式参考链接一
创建型设计模式参考链接二

使用场景

在需要创建复杂对象的地方可以使用工厂模式。

那么什么是复杂对象?
简单来说,复杂对象是指那些包含多个成员属性的对象,这些成员属性也称为部件或零件,如汽车包括方向盘、发动机、轮胎等部件,电子邮件包括发件人、收件人、主题、内容、附件等部件,一个典型的复杂对象类代码示例如下:

1
2
3
4
5
6
7
8
class Product  {
private String partA; //定义部件,部件可以是任意类型,包括值类型和引用类型
private String partB;
private String partC;
//partA的Getter方法和Setter方法省略
//partB的Getter方法和Setter方法省略
//partC的Getter方法和Setter方法省略
}

复杂对象参考链接

代码实现

抽象产品

1
2
3
4
5
public abstract class Product {

public abstract void method();

}

具体产品

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ProductA extends Product {
@Override
public void method() {
System.out.println("我是产品A");
}
}

public class ProductB extends Product {
@Override
public void method() {
System.out.println("我是产品B");
}
}

抽象工厂

1
2
3
4
public abstract  class Factory{

public abstract Product createProduct();
}

具体工厂

1
2
3
4
5
6
public class FactoryA extends Factory{
@Override
public Product createProduct() {
return new ProductA();
}
}

1
2
3
4
5
6
7
8
9
10
11
public class Client {

public void main(String[] args){

Factory factory = new FactoryA();
Product productA = factory.createProduct();
productA.method();

}

}

主要分为四大模块:

  • 抽象产品
  • 具体产品
  • 抽象工厂
  • 具体工厂

有时候也可以利用反射的方式来更简洁的生成具体的产品对象。

1
2
3
4
public abstract  class Factory{

public abstract <T extends Product> T createProduct(Class<T> clz);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CreateFactory extends Factory{


@Override
public <T extends Product> T createProduct(Class<T> clz) {

Product p = null;

try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}


return (T) p;
}
}
1
2
3
4
5
6
7
8
9
10
11
public class Client {

public void main(String[] args){

Factory factory = new CreateFactory();
Product productA = factory.createProduct(ProductA.class);
productA.method();

}

}

这种方式简洁,动态。当然你也可以为每一个产品创建一个工厂,这被称为多工厂模式。

当我们的工厂只有一个的时候,可以省略掉抽象工厂,直接创建具体工厂,这称为简单工厂模式。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器