工厂方法模式和模板方法模式很相似,模板方法(Template Method)是将具体的实现交给子类,而工厂方法(Factory Mehod)是将具体类的创建交给了子类。
在工厂方法模式中,父类只负责定义生成实例的方式,但并不决定要生成具体的类,具体的类的创建都交给子类去实现。这样就可以将生成实例的框架和具体生成实例的类解耦。
下面是一个简单的示例:
1. Product类和Factory类属于framework包,属于框架层,定义了类生成的方式。
2. Tv类和TvFactory类属于tv包,属于具体的产品层,定义了类具体的实例化。
Factory和Product都是抽象类,Factory类只定义了createProduct方法,而具体要创建什么Product则由子类来实现,而Product类也只是定义了use方法,具体的实现也由子类来实现。
Factory.java
package factoryMethod.framework;
public abstract class Factory {
public abstract Product createProduct(String productName);
}
Product.java
package factoryMethod.framework;
public abstract class Product {
public abstract void use();
}
TvFactory.java
package factoryMethod.tv;
import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
public class TvFactory extends Factory {
public Product createProduct(String productName) {
return new Tv(productName);
}
}
Tv.java
package factoryMethod.tv;
import factoryMethod.framework.Product;
public class Tv extends Product {
private String name;
public Tv(String name) {
this.name = name;
}
public void use() {
System.out.println("打开"+name+"电视");
}
}
测试方法如下:
public static void main(String[] args){ Factory tvFactory = new TvFactory(); Product ch = tvFactory.createProduct("长虹"); Product tcl = tvFactory.createProduct("TCL"); ch.use(); tcl.use(); }
测试结果:
工厂方法模式,主要的思路是将“框架”和“具体加工”这两方面内容分开,实例的生成不会影响框架的。当我们想要创建新的产品和工厂时,只需要分别继承Factory和Product即可,具体的实现ConcreteFactory和ConcreteProduct也不会对原有的框架造成影响。
工厂方法模式,主要是用通用模板来定义生成实例的方式,属于创建型的设计模式