- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 C# 中有以下“模式”(不是真正公认的 DP,但我倾向于在我的解决方案中经常使用它),其目标是基于接口(interface)(某种类型)提供对象实现的中心点工厂)。
它作为单例进行访问,用户请求给定接口(interface)的实现并返回适当的实现。
我的目标是将其迁移到 Java。我有两个原型(prototype)解决方案,但我对结果不太满意,因为在其中一个(更强大和复杂)上,由于 Java 的泛型限制,我不得不在实例化机制之上放置大量抽象尽管更简单,但功能也弱得多(它甚至无法利用泛型 - 这在我的使用情况下可能很方便)。
我想通过以下方式在 Java 中使用它来注册新的实现:
ServiceFactory.getInstance().addService(IMyInterface.class, new MyImplementation());
(其中 MyImplementations 实现 IMyInterface)。
遵循原始 C# 版本和两个 Java 版本:
C# 代码
public class ObjectProvider<ObjectType, BaseObjectType> : IObjectProvider<BaseObjectType>
where ObjectType : BaseObjectType, new()
{
public BaseObjectType ObjectInstance
{
get { return (BaseObjectType)new ObjectType(); }
}
}
public class ServiceManager
{
private static Dictionary<Type, object> _providersList = null;
private static object _listLocker = new object();
private ServiceManager() { }
private static void InicializeProvidersList()
{
_providersList = new Dictionary<Type, object>();
_providersList.Add(typeof(IMyType), new ObjectProvider<MyImplementation, IMyType>());
...
}
private static Dictionary<Type, object> ProvidersList
{
get
{
lock (_listLocker)
{
if (_providersList == null)
InicializeProvidersList();
return _providersList;
}
}
}
public static BusinessType GetBusinessClass<BusinessType>()
{
Dictionary<Type, object> list = ProvidersList;
Type pretendedType = typeof(BusinessType);
if (!list.ContainsKey(pretendedType))
return default(BusinessType);
IObjectProvider<BusinessType> provider = list[pretendedType] as IObjectProvider<BusinessType>;
return provider.ObjectInstance;
}
}
Java(更强大的解决方案)代码
public interface IInstantiator
{
<BaseObjectType> BaseObjectType getInstance(Object... args);
void setCacheable(boolean value);
}
public abstract class BaseInstantiator <BaseObjectType, ObjectType extends BaseObjectType> implements IInstantiator
{
protected Class<ObjectType> objectType;
protected boolean isCacheable = true;
protected BaseObjectType cache;
public BaseInstantiator(Class<ObjectType> objectType)
{
this.objectType = objectType;
}
public void setCacheable(boolean value)
{
this.isCacheable = value;
}
@SuppressWarnings("unchecked")
public final BaseObjectType getInstance(Object... args)
{
if(isCacheable && cache != null)
{
return cache;
}
else
{
BaseObjectType objectType = createInstance(args);
if(isCacheable)
{
cache = objectType;
}
return objectType;
}
}
protected abstract BaseObjectType createInstance(Object... args);
}
public class Instantiator <BaseObjectType, ObjectType extends BaseObjectType> extends BaseInstantiator <BaseObjectType, ObjectType>
{
public Instantiator(Class<ObjectType> ot)
{
super(ot);
}
@Override
protected BaseObjectType createInstance(Object... args)
{
try
{
return objectType.newInstance();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
return null;
}
}
public class ServiceFactory
{
private HashMap<Class, IInstantiator> services;
private static ServiceFactory instance;
public <BaseObjectType> void addService(Class<BaseObjectType> baseObjectType, IInstantiator instantiator)
{
this.getServices().put(baseObjectType, instantiator);
}
@SuppressWarnings("unchecked")
public <BaseObjectType> BaseObjectType getService(Class<BaseObjectType> baseObjectType, Object... args)
{
if(! getServices().containsKey(baseObjectType))
{
throw new NoSuchElementException("Unknown service interface!");
}
else
{
try
{
return (BaseObjectType) getServices().get(baseObjectType).getInstance(args);
}
catch (Exception e)
{
return null;
}
}
}
private ServiceFactory () { }
public static synchronized ServiceFactory getInstance()
{
if(ServiceFactory.instance == null)
{
ServiceFactory.instance = new ServiceFactory();
populate();
}
return ServiceFactory.instance;
}
private static void populate()
{
//...
}
private HashMap<Class, IInstantiator> getServices()
{
if(this.services == null)
{
this.services = new HashMap<Class, IInstantiator>();
}
return this.services;
}
}
Java(更简单、功能更弱的解决方案)
@SuppressWarnings("rawtypes")
public class ManagerFactory
{
private Map<Class, Object> managers;
private ManagerFactory()
{
populateFactory();
}
private static class SingletonHolder
{
public static final ManagerFactory INSTANCE = new ManagerFactory();
}
public static ManagerFactory getInstance()
{
return SingletonHolder.INSTANCE;
}
private void populateFactory()
{
this.managers = new HashMap<Class, Object>();
this.managers.put(ITaskManager.class, new TaskManager());
}
public Object getManager(Class interfaceClass)
{
if(this.managers.containsKey(interfaceClass))
return this.managers.get(interfaceClass);
else
return null;
}
}
任何人都可以提供一些帮助吗?
提前致谢!
最佳答案
这通常称为 Service Locator pattern .
我会推荐一个预构建的解决方案,例如 robo-guice .
关于Java - 服务提供者的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9582670/
我一直在寻找文件系统的 Java 命名和目录接口(interface) (JNDI) 服务提供商。 据我所知,Oracle 与 JDK 捆绑在一起,仅提供 RMI、DNS、LDAP 和 COS 服务提
我不熟悉单点登录的概念。我们已经有一个管理其用户的 Java Web 应用程序。现在的要求是,身份验证将由客户端的 SSO Idp(使用 SAML)提供,之后请求将被转发到我们的应用程序。由于我以前没
当我访问 laravel 时,它说 Symfony \ Component \ Debug \ Exception \ FatalErrorException 'Krucas\Notification
我(我们)正在创建一个包,作为我们 future CMS 的核心组件,当然,该包需要一些单元测试。当包注册时,它做的第一件事就是像这样设置后台/前端上下文: class FoundationServi
有没有办法在 Laravel 中仅为某些路由/URL 注册服务提供商?我想知道是否可以仅在需要的地方绑定(bind)服务,以及它是否有助于减少启动时的压力。 最佳答案 我不确定是否可以仅在特定路线上注
有没有办法在 Laravel 中仅为某些路由/URL 注册服务提供商?我想知道是否可以仅在需要的地方绑定(bind)服务,以及它是否有助于减少启动时的压力。 最佳答案 我不确定是否可以仅在特定路线上注
我正在开发一个 Laravel 5 应用程序,现在应用程序的代码应该在多个 laravel 5 应用程序中重复使用,这就是为什么我要创建一个 composer 包,然后我想在任何地方安装这个包具有相同
当使用预配置的服务提供者元数据时,在 spring security 中,扩展元数据委托(delegate)是否应该有 2 个 beans 定义?一个用于 IDP 元数据,一个用于 SP 元数据?
我知道如何绑定(bind)单个类: public function register() { $this->app->bind('search', 'Laracasts\Search\Sear
我创建了扩展 XeroServiceProvide 的自定义服务提供程序,基本上,我有多个 Xero 帐户,我想更改两个配置参数值运行时 消费者 key 和 消费者 secret .有没有快速的方法。
我有一个小程序需要调用JAXP,具体是SAXParserFactory .现在,正如您从 Javadoc 中看到的那样,这在内部使用了服务提供者机制,如文档中所述 here : 具体来说,如果它在我的
我试图找出一个涉及 Spring Security 和 SAML 的问题。我们正在尝试使用 Spring Security (spring-security-core-3.1.1.RELEASE.ja
我需要创建一个 RESTful WCF 服务,它需要使用 OAuth 2.0 对调用者进行身份验证。过去一周我一直在学习 OAuth 和它的提供者实现,这些是我发现的资源,它们接近我想要的。 (1)
我的 someModule 模块有一个服务: someModule.provider('someService', function() { this.options = {}; th
在 view composer documentation 之后我为我的基本 View 创建了一个类 ComposerServiceProvider 和一个 ViewComposer。我想为我站点的管
我收到此错误: BindingResolutionException in compiled.php line 1029: Target [App\Models\Contracts\Repositor
我正在考虑使用 Oracle 数据库作为 Web 服务提供程序并通过 PL/SQL 存储过程实现 Web 服务逻辑的选项。我以前曾编写过存储过程代码,但我不确定我应该朝哪个方向发展才能使用最新的解决方
在 AngularJS 2.0 Heroes 教程解释中指出,如果一个子组件在其 @Component Providers 列表中包含一个服务,那么 Angular 将创建该服务特定于该子组件的单独实
我正在构建一个 Web 应用程序,它将使用 DotNetOpenAuth 提供一个 api 和一个授权服务。我找到了 this example关于如何使用已经存在的服务提供者进行授权,但我想要一个关于
我正在努力在 Websphere Liberty 服务器上启用 samlWeb-2.0。我需要使用我的雇主提供的现有身份提供商来实现服务提供商部分进行身份验证。 samlWeb-2.0 功能已安装并启
我是一名优秀的程序员,十分优秀!