1、工厂方法模式定义:定义一个用于创建对象的接口,让子类决定实例化哪个类
2、工厂方法模式的使用场景:在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式
多工厂方法模式
代码示例:
1、定义一个抽象的产品接口(非必须)
/**
* 抽象的产品接口
*/
public abstract class Product {
/**
* 产品类的抽象方法,由具体的产品类去实现
*/
public abstract void productName();
}
2、具体的产品实现类
public class ProductA extends Product {
@Override
public void productName() {
Log.i("LHD", "这是A产品");
}
}
public class ProductB extends Product {
@Override
public void productName() {
Log.i("LHD", "这是B产品");
}
}
3、抽象工厂类
/**
* 抽象的工厂接口
*/
public abstract class Factory {
/**
* 抽象工厂方法,具体生产什么由子类去实现
*/
public abstract Product createProduct();
}
4、具体工厂类
/**
* A产品的工厂
*/
public class FactoryA extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
/**
* B产品的工厂
*/
public class FactoryB extends Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
使用:
Factory factory = new FactoryA();
Product p = factory.createProduct();
p.productName();
这种方式很常见,每个产品都有自己的工厂方法,他们实现了同样的工厂接口,需要哪个产品就使用哪个工厂,像这种拥有多个工厂的方式称为多工厂方法模式。
简单工厂(静态工厂)模式
当然我们可以有更简洁的方式,我们可以简化成一个工厂,并去掉接口,然后给工厂类传入一个参数,并根据参数来决定生产哪个,代码修改如下:
去掉接口,传入一个类参数,来决定生产哪个产品
/**
* 使用反射来根据参数创建对象
*/
public class CreateProductFactory {
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;
}
}
使用:
CreateProductFactory factory = new CreateProductFactory();//由于去掉了Factory,所以需要实例化具体的工厂对象
Product p = factory.createProduct(ProductA.class);//传入ProductA.class则生产A产品
//Product p = factory.createProduct(ProductB.class);//传入ProductA.class则生产B产品
p.productName();
像这样的只有一个工厂的方式称为简单工厂模式或静态工厂模式,它是工厂方法模式的一个弱化版本。
工厂方法模式是完全符合设计原则的,其降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。
另外还有一个抽象工厂模式,具体没怎么用过,就不做介绍啦。
以上就是工厂方法模式的简单介绍啦(#^ . ^#)