java反射机制---工厂设计模式的进化
程序员文章站
2024-01-19 19:19:52
...
一、基本使用和代码
简单工厂模式 使用步骤 1、创建抽象产品类 & 定义具体产品的公共接口; 2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品; 3、创建工厂类,根据传入不同参数从而创建不同具体产品类的实例; 4、外界通过调用工厂类的方法,传入不同参数从而创建不同具体产品类的实例
public class Demo2 {
public static void main(String args[]) {
// 4、外界通过调用工厂类的方法,传入不同参数从而创建不同具体产品类的实例
Factory factory = new Factory();
//生产商品A
factory.makeProdect("A").nameOfCreatedProduct();
//生产商品B
factory.makeProdect("B").nameOfCreatedProduct();
}
}
//1、创建抽象产品类 & 定义具体产品的公共接口;
abstract class Product {
public abstract void nameOfCreatedProduct();
}
//2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
class ProductA extends Product {
@Override
public void nameOfCreatedProduct() {
System.out.println("产品A");
}
}
class ProductB extends Product {
@Override
public void nameOfCreatedProduct() {
System.out.println("产品B");
}
}
//3、创建工厂类,根据传入不同参数从而创建不同具体产品类的实例;
class ProductC extends Product {
@Override
public void nameOfCreatedProduct() {
System.out.println("产品C");
}
}
class Factory {
public Product makeProdect(String productName) {
switch (productName) {
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
return null;
}
}
}
优点:
1、将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
2、把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
缺点
1、工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
2、违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
二、工厂模式优化
解决的问题: 1、操作成本高:每增加一个接口的子类,必须修改工厂类的逻辑 2、系统复杂性提高:每增加一个接口的子类,都必须向工厂类添加逻辑 方案: 采用反射机制: 通过 传入子类名称 & 动态创建子类实例,从而使得在增加产品接口子类的情况下,也不需要修改工厂类的逻辑
代码实现:
public class Demo2 {
public static void main(String args[]) {
// 4、外界通过调用工厂类的方法,传入不同参数从而创建不同具体产品类的实例
Factory factory = new Factory();
//生产商品A
factory.makeProdect("com.example.javademo.ProductA").nameOfCreatedProduct();
//生产商品B
factory.makeProdect("com.example.javademo.ProductB").nameOfCreatedProduct();
}
}
//1、创建抽象产品类 & 定义具体产品的公共接口;
abstract class Product {
public abstract void nameOfCreatedProduct();
}
//2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
class ProductA extends Product {
@Override
public void nameOfCreatedProduct() {
System.out.println("产品A");
}
}
class ProductB extends Product {
@Override
public void nameOfCreatedProduct() {
System.out.println("产品B");
}
}
//3、创建工厂类,根据传入不同参数从而创建不同具体产品类的实例;
class ProductC extends Product {
@Override
public void nameOfCreatedProduct() {
System.out.println("产品C");
}
}
class Factory {
//通过反射机制实现具体产品的创建
public Product makeProdect(String productName) {
Product product=null;
try{
//根据产品类名获取产品类型的Class对象
Class pClass=Class.forName(productName);
//通过Class对象动态创建该产品对象
product= (Product) pClass.newInstance();
}catch (Exception e){
e.printStackTrace();
}
return product;
}
}
上一篇: 方差分析
下一篇: matplotlib绘图无法显示中文