工厂模式专门负责实例化有大量公共接口的类。工厂模式可以动态地决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类。
工厂模式包含以下几个形态:
- 简单工厂模式。它的工厂类是根据提供给它的参数,返回的是几个可能产品中的一个类的实例,通常情况下,它返回的类都有一个公共的父类和公共的方法。
- 工厂方法模式。工厂方法模式是类的创建模式,其用意是定义一个用于创建产品对象的工厂的接口,而将实际创建工作推迟到工厂接口的子类中。
- 抽象工厂(Abstract Factory)模式。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时使用的一种工厂模式,抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个品族中的产品对象。
/*产品抽象类*/
public abstract class product{
/*产品类的抽象方法*/
public abstract void method();
}
public class ConcreteProductA extends Product {
public void method(){
System.out.println("我是具体实现的产品A");
}
}
public class ConcreteProductB extends Product {
public void method(){
System.out.println("我是具体实现的产品B");
}
}
/*抽象工厂类*/
public abstract class Factory {
/*抽象工厂方法*/
public abstract Product createProduct();
}
/*具体工厂类*/
public class ConcreteFactory extends Factory{
public Product createProduct(){
return new ConcreteProductA();
}
}
public class client{
public static void main(String []args){
Factory factory = new ConcreteFactory();
Product p = factory.createProduct();
p.method();
}
}
如果生产的产品可能在主结构上并没有什么差异,也可以利用反射的方式更简洁地来生产具体产品对象,此时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类:
public abstract class Factory{
/**
*@param clz 产品对象类类型
*/
public abstract <T extends Product> T createProduct(Class<T> clz);
}
对于具体的工厂类,则通过反射获取类的实例:
public class ConcreteFactory extends Factory{
public <T extends Product> T createProduct(Class<T> clz){
Product p = null;
try{
p = Class.forName(clz.getName()).newInstanct();
}catch(Exception e){
e.printStackTrace();
}
return (T) p;
}
}
Client类中的实现:
public class Client{
public static void main(String []args){
Factory factory = new ConcreteFactory();
Product p = factory.createProduct(ConcreteProductB.class);
p.method();
}
}
一般在任何需要生成复杂对象的地方,都可以使用抽象工厂方法模式。其降低了对象之间的耦合度,但是,抽象工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。
网友评论