(学习笔记)
定义共有抽象方法
将每个类都可以实现的共有的方法定义为抽象方法
// 稳定接口
interface Product {
public void method1();
}
实现类
每个实现类可以实现自己不同的业务
class ProductA implements Product {
public void method1() {
System.out.println("A实现类");
}
}
class ProductA1 implements Product {
public void method1() {
System.out.println("B实现类");
}
}
抽象类创建工厂方法
当不确定对象要返回什么类型,可以利用多态返回值设置共同实现的接口。(抽象类不能够直接创建对应的实例)
abstract class Application {
abstract Product createProduct();
Product getObject() {
Product product = createProduct();
// ...
// ...
return product;
}
}
工厂方法具体实现
// 工厂方法具体实现类
class ConcreteProductA extends Application {
@Override
Product createProduct() {
// 业务逻辑 1
return new ProductA();
}
}
class ConcreteProductA1 extends Application {
@Override
Product createProduct() {
//业务逻辑 2
return new ProductA1();
}
}
拓展简单工厂
/**
* 简单工厂
*/
class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("0")) {
return new ProductA();
} else if (type.equals("1")) {
return new ProductA1();
} else {
return null;
}
}
}
优点:
1.符合开闭原则(在拓展其他功能时,直接实现抽象类加入新的逻辑,不需要修改之前已经稳定的逻辑)
2.单一职责(每个实现类专注于实现自己的功能,它们之间互相没有任何干扰)
3.将具体产品和创建者解耦
class Run{
public static void main(String[] args) {
// 如果想要对实现的具体功能进行更换时只需要更换对应的实现类
Application app1 = new ConcreteProductA();
Application app2 = new ConcreteProductA1();
}
}
应用场景
1.当不知道该使用对象的确切类型的时候
2.当希望为库或框架提供扩展其内部组件的方法时
在源码中的应用:
比如NumberFormat的getInstance()方法就使用了静态工厂方法
跟进源码:
NumberFormat 类是被 abstract 修饰的,外界不能直接通过new创建它的实例,需要使用多态来创建它子类的实例