设计模式之工厂方法模式
来源:互联网 发布:苏州天创软件 编辑:程序博客网 时间:2024/05/21 18:39
工厂方法模式是创建型设计模式之一。
定义一个用于创建对象的接口,让子类决定实例化哪个类,或者子类根据传入的参数不同而创建不同的类。
public abstract class Product { //产品类的抽象方法,有具体的产品类去实现 public abstract void method();}
public class ProductA extends Product { //产品类A @Override public void method() { System.out.println("这是具体的产品A"); }}
public class ProductB extends Product{ //产品类B @Override public void method() { System.out.println("这是具体的产品B"); }}
public abstract class Factory{ /** * 抽象工厂方法 * 具体产生什么由子类去实现 */ public abstract Product createProduct();}
public class MakeFactory extends Factory { //工厂类的实现类,在这只生产A产品 @Override public Product createProduct() { return new ProductA(); }}
public class Client { public static void main(String[] args){ MakeFactory factory = new MakeFactory(); ProductA productA = (ProductA) factory.createProduct(); }}
通过以上方法可以产生一个ProductA对象,但是,不能产生ProductB对象。
我们可以这样做:
public abstract class Factory{ /** * 抽象工厂方法 * 具体产生什么由子类去实现 */ public abstract Product createProduct(String product);}
public class MakeFactory extends Factory { @Override public Product createProduct(String product) { Product product1=null; switch (product){ case "productA":product1 = new ProductA(); break; case "productB":product1 = new ProductB(); break; } return product1; }}
public class Client { public static void main(String[] args){ MakeFactory factory = new MakeFactory(); ProductA productA = (ProductA) factory.createProduct("productA"); }}
这样,我们就可以根据传入的参数不同,创建不同的对象。但是,当我们需要生产的对象比较多时,我们是不是需要switch case许多次?我们是不是需要改原来的代码?Java中类的加载可以更好地解决这个问题。
public abstract class Factory{ /** * 抽象工厂方法 * 具体产生什么由子类去实现 */ public abstract <T extends Product> T createProduct(Class<T> tClass);}
public class MakeFactory extends Factory { @Override public <T extends Product> T createProduct(Class<T> tClass) { Product p = null; try { p= (Product) Class.forName(tClass.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (T) p; }}
public class Client { public static void main(String[] args){ MakeFactory factory = new MakeFactory(); ProductA productA = (ProductA) factory.createProduct(ProductA.class); }}
此时,无论我们的产品有多少,都是可以产生的。
代码有许多不足之处,需要改进,请谅解。
0 0
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式 之 工厂方法
- 设计模式 之 工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 《设计模式》之工厂方法
- 设计模式之--工厂方法
- IO流——转换流之BufferedWriter
- SPFA 模板
- 安卓手机你以为你删除了文件短信,通讯录你就百事无忧了?
- web.xml配置文件
- Hibernate映射的基本操作
- 设计模式之工厂方法模式
- 数据定义语句(DDL,Data definitionlanguage)
- Linux安装JDK
- 自动清楚浏览器的缓存
- BroadcastReceive——BroadcastReceiver的生命周期
- CCF 相反数
- 用 React.js 写一个最简单的 To-do List 应用
- 数据的加密和解密
- 哈理工OJ 1425 阶乘问题(水题)