定义
定义一个用于创建对象的接口,让子类决定实例化哪个类;
拥有多个工厂的模式,称为多工厂方法模式。只有一个工厂的模式,可以简化抽象工厂,将生成产品的方法改成静态方法,称为简单工厂方法模式。
例子
抽象工厂:Factory.java
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> cls);
}
具体工厂:ConcreteFactory.java
package com.zc.factory;
public class ConcreteFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> cls) {
// TODO Auto-generated method stub
Product mProduct = null;
try {
mProduct = (Product) cls.forName(cls.getName()).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T) mProduct;
}
}
抽象产品:Product.java
package com.zc.factory;
public abstract class Product {
public abstract void doThing();
}
具体产品A:ConcreteProductA.java
package com.zc.factory;
public class ConcreteProductA extends Product {
@Override
public void doThing() {
// TODO Auto-generated method stub
System.out.println("ConcreteProductA");
}
}
具体产品B:ConcreteProductB.java
package com.zc.factory;
public class ConcreteProductB extends Product {
@Override
public void doThing() {
// TODO Auto-generated method stub
System.out.println("ConcreteProductB");
}
}
客户端调用:Client.java
package com.zc.factory;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factory mFactory = new ConcreteFactory();
ConcreteProductA mProductA = mFactory.createProduct(ConcreteProductA.class);
mProductA.doThing();
// ConcreteProductB mProductB = mFactory.createProduct(ConcreteProductB.class);
// mProductA.doThing();
}
}
结论:
任何需要生成复杂对象的地方,都可以使用工厂使用模式。复杂对象适合使用工厂使用模式,用new就可以完成创建的对象无需工厂模式。