工厂方法模式
设计模式使人们可以更加简单方便的复用成功的设计和体系结构,设计模式中也遵循着一些原则,而这些原则也是JAVA开发中所提倡的,比如针对接口编程而不是针对实现编程,优先使用对象组合而不是类继承等,总共有六大原则,感兴趣的朋友可以自行深入了解。
设计模式总体可分为以下三类
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其关系如图所示。
接下来,进入工厂方法模式
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。
使用场景
1. 当一个类不知道它所必须创建的对象的类的时候。
2. 当一个类希望由它的子类来指定它所创建的对象的时候。
3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
结构
实现
先创建接口类Product
public interface Product {
void method();
}
Product的具体实现
public class ProductA implements Product {
public void method() {
System.out.println("this is ProductA's Method");
}
}
public class ProductB implements Product {
public void method() {
System.out.println("this is ProductB's Method");
}
}
工厂类Factory
public class Factory {
public Product createProduct(String type){
if("ProductA".equals(type)){
return new ProductA();
}else if("ProductB".equals(type)){
return new ProductB();
}else{
return null;
}
}
}
我们来测试一下
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new Factory();
Product product = factory.createProduct("ProductA");
product.method();
}
}
输出结果为:this is ProductA’s Method
从以上代码我们可以理解工厂方法的实现,同时也发现一些问题,比如当传递的参数是错误的时候,得到的对象是空的,这显然不太雅观,于是我们对Factory类进行一下改造。
public class Factory {
public Product createProductA(){
return new ProductA();
}
public Product createProductB(){
return new ProductB();
}
}
测试代码
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new Factory();
Product product = factory.createProductB();
product.method();
}
}
测试结果:this is ProductB’s Method
从测试代码中可以发现其实Factory类可以不需要创建实例,我们可以把工厂方法设置成静态的,因此工厂方法模式又变种升级成静态工厂方法模式
public class Factory {
public static Product createProductA(){
return new ProductA();
}
public static Product createProductB(){
return new ProductB();
}
}
测试代码
public class FactoryTest {
public static void main(String[] args) {
Product product = Factory.createProductB();
product.method();
}
}
测试结果:this is ProductB’s Method
实际应用中,我们更偏向于使用静态的工厂方法模式