工厂模式(更新之前的工厂模式)
来源:互联网 发布:windows10怎么隐藏软件 编辑:程序博客网 时间:2024/06/03 10:26
工厂模式,适用于创建复杂的对象的地方,若可直接用new完成对象创建则可无需使用工厂模式
工厂模式的主要组成:
抽象产品类:
package ban.com;public abstract class Product { abstract void method();}
具体产品类A:
package ban.com;public class ConcreteProductCup extends Product { @Override void method() { System.out.println("Cup"); }}
具体产品类B:
package ban.com;public class ConcreteProductSpoon extends Product { @Override void method() { System.out.println("Spoon"); }}
抽象工厂类:
package ban.com;public abstract class Factory { public abstract Product createProduct();}
具体工厂类:
package ban.com;public class ConcreteFactory extends Factory{ @Override public Product createProduct(){ return new ConcreteProductSpoon(); }}
客户类:
package ban.com;public class Client { public static void main(String[] args) { Factory factory=new ConcreteFactory(); factory.createProduct().method(); }}
执行打印的数据为Spoon,很标准的工厂模式,要是像创建Cup对象,可以直接在创建一个工厂实现类生成Cup对象。
package ban.com;public class ConcreteFactory extends Factory{ @Override public Product createProduct(){ return new ConcreteProductCup(); }}
工厂模式主要分为四个模块:
1、抽象工厂:工厂模式的核心
2、抽象产品:用于工厂方法创建的父类
3、具体工厂类的实现:具体的创建逻辑
4、具体产品类的实现:产品的特有逻辑
这样看上去,需要那个就创建那个工厂的实现类,但是代码比较多,也不简洁,这样我们可以根据反射的方式简洁的来生产具体产品对象,这里会用到泛型的部分(以后会更新泛型部分的知识)
更改抽象工厂:
package ban.com;public abstract class Factory { public abstract <T extends Product> T createProduct(Class<T> clz);}
T为继承Product的泛型,返回值必须是Product的子类,传入的clz即为类对象
具体工厂实现:
package ban.com;public class ConcreteFactory extends Factory{ @Override public <T extends Product> T createProduct(Class<T> clz) { Product product=null; try { //通过反射获取对象实例 product=(Product) Class.forName(clz.getName()).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return (T) product;//需是Product的子类 }}
这样就可以保证直接传入所需类的名称就可以获取相应的对象,更改Client:
package ban.com;public class Client { public static void main(String[] args) { Factory factory=new ConcreteFactory(); factory.createProduct(ConcreteProductCup.class).method(); factory.createProduct(ConcreteProductSpoon.class).method(); }}
打印结果就是:Cup Spoon
这样的好处是可以比较简洁、动态的生成所需要的对象,之前的一种方式成为多工厂方式,都可以使用
阅读全文
0 0
- 工厂模式(更新之前的工厂模式)
- [php]选择工厂和更新工厂模式
- 工厂模式(简单工厂、工厂方法)
- 最常用的设计模式----工厂模式家族(简单工厂模式, 工厂方法模式, 抽象工厂模式)
- 抽象工厂模式、简单工厂模式、工厂模式的区别
- 简单工厂模式、工厂模式、抽象工厂模式的区别
- 设计模式--工厂模式(一个关于工厂的故事)
- 工厂模式(工厂方法模式,抽象工厂模式) Java
- 工厂模式(简单工厂模式、工厂方法模式)
- java va中工厂模式( 静态工厂模式、工厂方法模式、抽象工厂模式)的介绍以及简单例子
- 静态工厂模式(简单工厂模式)
- 简单工厂模式(静态工厂模式)
- 工厂模式(一)--简单工厂模式
- 工厂模式(二)--工厂方法模式
- 工厂模式(三)--抽象工厂模式
- 没有工厂模式(工厂模式2)
- 简单工厂模式(工厂模式3)
- 工厂模式(工厂模式4)
- 设计模式之适配器模式
- 设计模式之组合模式
- 关于对qt connect函数的理解
- 【2017.6.5】logger.error()逗号和加号区别
- 设计模式之策略模式
- 工厂模式(更新之前的工厂模式)
- 设计模式之总纲
- 数据结构之Hashtable
- 数据结构之HashMap
- 倒影
- 如何使用万能地图下载器下载矢量建筑边界
- bzoj1735[Usaco2005 jan]Muddy Fields 泥泞的牧场
- cookie or session 状态保存信息存储
- 如何向一个Fragment传递参数---setArguments方法的介绍