设计模式(5)工厂方法模式
定义
定义一个用于创建对象的接口,让子类决定实例化那个类。
使用场景
在任何需生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
模式的简单实现
抽象产品类:
public abstract class Product {
/**
* 产品类的抽象方法
* 由具体的产品类去实现
* */
public abstract void method();
}
具体产品类A:
public class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("我是产品A");
}
}
具体产品类B:
public class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("我是产品B");
}
}
抽象工厂类:
public abstract class Factory {
/**
* 抽象工厂方法
* 具体由子类实现
*
* @return 具体的产品对象
* */
public abstract Product createProduct();
}
具体工厂类:
public class ConcreteFactory extends Factory {
/**
* 具体工厂类
* */
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
调用:
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
}
}
结果:
我是产品A
如果想得到ConcreteProductB的实例,更改ConcreteFactory逻辑:
public class ConcreteFactory extends Factory {
/**
* 具体工厂类
* */
@Override
public Product createProduct() {
//return new ConcreteProductA();
return new ConcreteProductB();
}
}
上面这种方式可能不是很灵活,可以利用反射实现,如下:
public abstract class Factory {
/**
* 抽象工厂方法
* 具体由子类实现
*
* @param clz 产品对象类类型
*
* @return 具体的产品对象
* */
public abstract <T extends Product> T createProduct(Class<T> clz);
}
具体工厂类修改:
public class ConcreteFactory extends Factory {
/**
* 具体工厂类
* */
@SuppressWarnings("unchecked")
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)product;
}
}
Client实现:
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct(ConcreteProductB.class);
product.method();
}
}
如果我们的工厂只有一个,我们可以进行简化,这种方式又称为简单工厂模式或者静态工厂模式。如下:
public class Factory {
/**
* 抽象工厂方法
* 具体由子类实现
*
* @param clz 产品对象类类型
*
* @return 具体的产品对象
* */
public static <T extends Product> T createProduct(Class<T> clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)product;
}
}
Android源码中的工厂方法模式
-
Activity的各种生命周期
-
ArrayList和HashSet
总结
优点:
(1)工厂方法模式完全符合设计原则,降低了对象之间的耦合。高层模块只需要知道产品的抽象类,其他的实现都不需要关心。
(2)良好的封装性,代码结构清晰。扩展性好。
缺点:
每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类。同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要设计者权衡利弊。
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/12/design-pattern-factory-method-pattern/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论