工厂方法模式
2019-05-29 本文已影响0人
枫狂的孩子
1.工厂方法模式介绍
工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如activity里的各个生命周期方法,以onCreate为例,他就可以看作是一个工厂方法,我们在其中可以构造我们的view,并通过setContentView()返回给framework处理等。
2.工厂方法模式的定义
定义一个用于创建对象的接口,让子类决定实例化那个类。
3.工厂方法模式的使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
4.工厂模式的简单用例
public abstract class Product {
/**
* 产品类的抽象方法
* 有具体的产品类去实现
*/
public abstract void method();
}
public class ConcreateProductA extends Product {
@Override
public void method() {
System.out.print("我是具体产品A");
}
}
public class ConcreateProductB extends Product {
@Override
public void method() {
System.out.print("我是具体产品B");
}
}
public abstract class Factory {
/**
* 抽象工厂类
* 具体产生什么由子类去实现
* @return
*/
public abstract Product createProduct();
}
public class ConcreteFactory extends Factory {
@Override
public Product createProduct() {
return new ConcreateProductA();
}
}
public class Client {
public static void main(String[] agrs) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
}
}
四大模块:
抽象工厂:工厂方法模式的核心;
具体工厂:实现具体的业务逻辑;
抽象产品:工厂方法模式创建的产品的父类;
具体产品:实现抽象产品的某个具体产品的对象;
这种方法比较常见,需要哪一个产品就生产那个,有时候也可以利用反射方式更简洁的来生成具体产品对象,此时,需要在工厂方法的参数列表中传入一个class类来决定是哪一个产品类。
public abstract class Factory1 {
/**
* 抽象工厂类
* 具体产生什么由子类去实现
*
* @return
*/
public abstract <V extends Product> V createProduct(Class<V> clz);
}
public class ConcreteFactory1 extends Factory1 {
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) p;
}
}
再来看看具体的Client中的实现
public class Client {
public static void main(String[] agrs) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
Factory1 factory1 = new ConcreteFactory1();
Product product1 = factory1.createProduct(ConcreateProductA.class);
product1.method();
}
}
需要哪一个类的对象就传入哪一个类的对象,这种方法比较简洁,动态,如果你不喜欢这种方式,以恶可以尝试每一个产品定义一个具体的工厂,各司其职。
像这样拥有多个工厂的方式我们称为工厂方法模式。它降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。