我正在使用据称使用Factory模式的java代码,但我并不完全相信这种模式.
我的代码执行此操作:
// the factory
class SomeFactoryImpl {
Set<SomeClass> getSomeListOfObjects();
}
Run Code Online (Sandbox Code Playgroud)
在代码的某处:
{ ...
SomeFactory factory = new SomeFactoryImpl();
Set<SomeClass> list = factory.getSomeListOfObjects();
}
Run Code Online (Sandbox Code Playgroud)
我正在思考的一点是,如果工厂类没有静态的create()方法,那么就需要实例化一个工厂,IMO应该像实例化一个对象一样复杂.
我不认为这样的工厂可以返回要生成的对象集合的论点已经足够了.如果在从工厂实际创建对象之前需要创建工厂实例,我觉得可以有更清晰的解决方法.
我觉得如果create方法是工厂类的静态方法,那就更好了.但我也确信我的观点并不完全"正确".
那么SO社区可以举例说明实例化Factory对象比使用静态创建方法更好吗?
另外,我遇到了一个类似问题的答案,其中列出了这些链接和答案:所以我需要清楚地了解FactoryMethodPattern,FactoryMethod和CreationMethod与代码示例之间的区别.
目前我已经创建了一个ABCFactory类,它有一个创建ABC对象的方法.现在我想起来了,也许不是有工厂,我可以在我的ABC方法中制作一个静态方法.进行此项更改的专业人士和合作伙伴是什么?它不会导致相同吗?我不认为有其他类继承ABC,但一个人永远不会知道!
谢谢
我是开发抽象工厂模式的新手,并希望在数据层中创建一个抽象工厂,它将帮助我将该层链接到任何其他数据库,例如sql和oracle.你能帮我完成这项任务吗?请注意,数据库的连接字符串将在此层中找到,而不是在演示文稿中.
谢谢
EDITED
public abstract class Database
{
public string connectionString;
#region Abstract Functions
public abstract IDbConnection CreateConnection();
public abstract IDbCommand CreateCommand();
public abstract IDbConnection CreateOpenConnection();
public abstract IDbCommand CreateCommand(string commandText, IDbConnection connection);
public abstract IDbCommand CreateStoredProcCommand(string procName, IDbConnection connection);
public abstract IDataParameter CreateParameter(string parameterName, object parameterValue);
#endregion
}
Run Code Online (Sandbox Code Playgroud)
public class SQLDatabase : Database
{
public override IDbConnection CreateConnection()
{
return new SqlConnection(connectionString);
}
public override IDbCommand CreateCommand()
{
return new SqlCommand();
}
public override IDbConnection CreateOpenConnection()
{
SqlConnection connection …Run Code Online (Sandbox Code Playgroud) 由于Python是一种鸭式语言,因此在Python中编写工厂类毫无意义? http://en.wikipedia.org/wiki/Factory_method_pattern
我有一个名为Validator的抽象类:
public abstract class Validator<T> where T : IValidatable
{
public abstract bool Validate(T input);
}
Run Code Online (Sandbox Code Playgroud)
我有一些具体的实现.一个是AccountValidator:
public class AccountCreateValidator : Validator<IAccount>
{
public override bool Validate(IAccount input)
{
//some validation
}
}
Run Code Online (Sandbox Code Playgroud)
另一个是LoginValidator:
public class LoginValidator : Validator<IAccount>
{
public override bool Validate(IAccount input)
{
//some different validation
}
}
Run Code Online (Sandbox Code Playgroud)
我现在想要创建一个工厂来返回验证器实现的实例.就像是:
public static class ValidatorFactory
{
public static Validator GetValidator(ValidationType validationType)
{
switch (validationType)
{
case ValidationType.AccountCreate:
return new AccountCreateValidator();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我喜欢这样称呼它
Validator myValidator = ValidatorFactory.GetValidator(ValidationType.AccountCreate);
Run Code Online (Sandbox Code Playgroud)
但是它不喜欢返回新的AccountCreateValidator()行,或者我将myValidator声明为Validator而不是 …
假设我有一个带有工厂方法的类
class A {
public:
static A* newA()
{
// Some code, logging, ...
return new A();
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用a来阻止此类对象的实例化new,以便工厂方法是创建对象实例的唯一方法?
嘿家伙我有一点设计问题.我创建了一个率计算器,如下所示:
Public Interface ICalculator
Property PaymentTerm As Double
Function Calculate() As CommissionValues
ReadOnly Property CalculationRule As CalculationRuleEnum
End Interface
Public Interface IFlexibleRateCalculator
Inherits ICalculator
Property TransferRate As Decimal
End Interface
Public Interface IFixedRateCalculator
Inherits ICalculator
Property ContractRate As Decimal
End Interface
Public Interface IRateSettingBase
Property RateType As RateTypeEnum
ReadOnly Property Calculator As ICalculator
End Interface
Public MustInherit Class RateSetting
Implements IRateSettingBase
Public MustOverride ReadOnly Property Calculator() As ICalculator Implements IRateSettingBase.Calculator
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
dim ratevalues as RateValues = RateSetting().Calculator.Calculate()
Run Code Online (Sandbox Code Playgroud)
很简单.问题是每种类型的计算器都有自己的属性集,需要设置它们才能使Calculate()方法正常工作.所以我最终必须实现如下
FlexibleRateCalculator
Implements …Run Code Online (Sandbox Code Playgroud) 好的,所以我被赋予了一项任务,要求我同时使用策略和工厂设计模式.这是问题所在:
您正在为银行开发一个用于处理贷款的申请.有Loan一个方法的类capital().该capital()方法包含一个丑陋的if-then-else条件,它检查一些Loan对象实例属性,并根据属性使用正确的贷款类型策略.这是该capital()方法的伪代码:
capital() {
if (expiry == null && maturity != null) {
// Find capital for term loan
return commitment * duration * riskFactor;
}
if (expiry != null && maturity == null) {
if (getUnusedPercentage() != 1.0) {
// Find capital for revolving loan
return commitment * unusedPercentage * duration * riskFactor;
} else {
// Find capital for complex loan
return (outstandingRiskAmount * duration * riskFactor) + (unusedRiskAmount * …Run Code Online (Sandbox Code Playgroud) 我之前使用标准工厂模式方法创建类的实例(实现特定接口)使用Factory类,该类具有"create"方法,该方法根据传递给它的参数返回正确的实例(下面给出的示例片段) ):
public class SimpleFactory {
public static SimpleObjectInterface getSimpleObject(int data) {
SimpleObjectInterface toReturn;
switch(data) {
case 1:
toReturn = new OneSimpleObject();
break;
case 2:
toReturn = new TwoSimpleObject();
break;
default:
toReturn = new DefaultSimpleObject();
break;
}
return toReturn;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我在我的项目中使用Guice进行依赖注入.我的问题是如何使用Guice实现上述功能?需要哪个实现实例是在运行时根据一些用户输入决定的.
我查看了Provider和@Named注释.但我不明白它究竟会对我有多大帮助.
我经常使用代表工厂生产的实体的类.为了使我的工厂简单的测试很容易,我通常执行IEquatable<T>,同时也覆盖GetHashCode和Equals(由所建议的MSDN).
例如; 采用以下实体类,这是为了示例目的而简化的.通常我的类有更多属性.偶尔会有一个集合,在Equals我检查的方法中使用SequenceEqual.
public class Product : IEquatable<Product>
{
public string Name
{
get;
private set;
}
public Product(string name)
{
Name = name;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Product product = obj as Product;
if (product == null)
{
return false;
}
else
{
return Equals(product);
}
}
public bool Equals(Product other)
{
return Name == other.Name; …Run Code Online (Sandbox Code Playgroud) factory-pattern ×10
c# ×4
java ×3
generics ×2
asp.net ×1
c++ ×1
guice ×1
iequatable ×1
oop ×1
python ×1
uml ×1
unit-testing ×1
vb.net ×1