静态工厂模式
来源:互联网 发布:数据库管理系统的特点 编辑:程序博客网 时间:2024/05/05 11:50
考虑使用静态工厂模式代替构造函数的优势如下:
1、静态工厂方法与构造器的不同在于,静态工厂方法有名字,而构造器没有(构造器与类名称相同),例如:
构造器People()返回的可能是男人也可能返回女人(假设),而People.getMan()则可以根据性别去只返回男人,People.getWoman可以根据性别去只返回女人。
2、不必每次调用它们都创建一个新对象(根据以下代码思考与单例模式的区别)。
将事先构建好的多个对象缓存起来(比如缓存到一个Map),再需要用的时候get(name)出来即可,这种情况可以减少创建对象的开支。我们可以这样考虑,所谓工厂,工厂里面必定可以生产多个产品,每个产品只提供唯一的服务(单例例)。
代码如下:
Service接口
public interface Service { void method1(); void method2();}
Provider接口
public interface Provider { Service newService();}
SubService1类继承Service接口,使用单例模式
public class SubService1 implements Service{ private static Service INSTANCE = new SubService1(); private SubService1(){} public static Service getInstance(){ if(null == INSTANCE){ INSTANCE = new SubService1(); } return INSTANCE; } @Override public void method1() { System.out.println("SubService1对象的method1方法"); } @Override public void method2() { System.out.println("SubService1得method2的方法"); }}
SubService1Provider类实现Provider接口,用来提供SubService1 实例
public class SubService1Provider implements Provider{ @Override public Service newService() { return SubService1.getInstance(); }}
SubService2类实现Service接口,使用单例模式
public class SubService2 implements Service{ private static Service INSTANCE = new SubService2(); private SubService2(){ } public static Service getInstance(){ if(null == INSTANCE){ INSTANCE = new SubService2(); } return INSTANCE; } @Override public void method1() { System.out.println("SubService2对象的method1的方法"); } @Override public void method2() { System.out.println("SubService2得method2的方法"); }}
SubService2Provider类实现Provider接口,用来提供SubService2 实例
public class SubService2Provider implements Provider{ @Override public Service newService() { //System.out.println("在proder2中创建SubService2的对象"); return SubService2.getInstance(); }}
Services类,类似工厂,根据唯一名字可以从工厂里取得很多Provider,而每个Provider只提供唯一的服务
public class Services { private Services(){} //将构造器私有化 //Map类似一个篮子,把可能用到的东西存进去,以后要去的时候用它的键 //去取它的值,并且每次取出来的时候都是同一个对象 private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; public static void registerDefaultProvider(String name, Provider p){ providers.put(name, p); } public static Service newInstance(String name){ Provider p = providers.get(name); if(null == p){ throw new IllegalArgumentException( "No provider registered with name "+name); } return p.newService(); }}
Test类,做测试
public class Test { public static void main(String[] args) { saveProvider(); //保存提供器 Service s1 = Services.newInstance("第一个1号提供器"); System.out.println(s1); s1.method1(); Service s2 = Services.newInstance("第一个1号提供器"); System.out.println(s2); s2.method1(); } //先向工厂缓存提供器,以后要用,直接获取 public static void saveProvider(){ SubService1Provider p1_1 = new SubService1Provider(); SubService1Provider p1_2 = new SubService1Provider(); SubService2Provider p2_1 = new SubService2Provider(); SubService2Provider p2_2 = new SubService2Provider(); SubService2Provider p2_3 = new SubService2Provider(); Services.registerDefaultProvider("第一个1号提供器", p1_1); Services.registerDefaultProvider("第二个1号提供器", p1_2); Services.registerDefaultProvider("第一个2号提供器", p2_1); Services.registerDefaultProvider("第二个2号提供器", p2_2); Services.registerDefaultProvider("第三个2号提供器", p2_3); }}
执行结果:
cn.test.refeparam.designMode.staticFactory.SubService1@47ffccd6
SubService1对象的method1方法
cn.test.refeparam.designMode.staticFactory.SubService1@47ffccd6
SubService1对象的method1方法
可以看出,一个提供器只提供一个服务。
修改main方法:
public static void main(String[] args) { saveProvider(); //保存提供器 Service s1 = Services.newInstance("第一个1号提供器"); System.out.println(s1); s1.method1(); Service s2 = Services.newInstance("第二个2号提供器"); System.out.println(s2); s2.method1(); }
执行结果:
cn.test.refeparam.designMode.staticFactory.SubService1@6094cbe2
SubService1对象的method1方法
cn.test.refeparam.designMode.staticFactory.SubService2@2b04a681
SubService2对象的method1的方法
可以看出,不同提供器提供不同的方法。
- 工厂模式:静态工厂
- 工厂模式-静态工厂
- 静态工厂方法模式
- 静态工厂模式
- 设计模式--静态工厂
- 静态工厂模式
- 静态工厂模式 理解
- 静态工厂设计模式
- 静态方法工厂模式
- 静态工厂模式
- 静态工厂模式
- 静态工厂模式
- 静态工厂模式
- 什么是静态工厂模式
- 设计模式-静态工厂
- 静态工厂模式(简单工厂模式)
- 简单工厂模式(静态工厂模式)
- 学习心得---简单工厂模式/静态工厂方法
- 算法相关
- Unity3D学习笔记——初级知识
- Unity3D学习笔记——IDE菜单栏
- Unity3D学习笔记——Rigdbody刚体组件
- apache本地多端口配置
- 静态工厂模式
- Unity3D学习笔记——组件之Mesh(网格)
- Hadoop配置文件配置项定义说明(转载,自用,随着学习与版本更新逐渐更新)
- 前端开发人员必须了解的七大技能图谱
- Unity3D学习笔记——组件之Effects(效果/特效)——Particle System(粒子系统)
- Unity3D学习笔记——Android重力感应控制小球
- Unity3D学习笔记——游戏组件之Mesh(网格组件)
- es6 数组
- refind实现Win10 + Kali2.0 双引导