设计模式之工厂方法模式

时间:2022-10-02 16:33:53

工厂方法模式

设计模式使人们可以更加简单方便的复用成功的设计和体系结构,设计模式中也遵循着一些原则,而这些原则也是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

实际应用中,我们更偏向于使用静态的工厂方法模式