Status: Fendy和Glen Best的答案 同样 被我 接受 和尊重,但由于可以接受并给予赏金,因此我选择Fendy的答案。
Status:
Scenario:
如果我有 一些代码 有 被多次重复使用 在 许多类 (很少有轻微参数改变是显而易见的)和并发线程,哪种方法去?
必须重用的代码可以是任何理智的东西(在考虑了静态和非静态上下文以及方法制作技术的前提下)。它可以是一种算法,一种执行connect,operate,close的DB方法。什么都可以
MyMethods.class
1.a. 制作 方法 static和呼叫(在各个阶层和并发线程)直接作为MyMethods.someMethod();
static
MyMethods.someMethod();
1.b. 制作 方法 non-static和当时打电话给他们, instantiate 全班通过MyMethods mm = MyMethods(); mm.someMethod();
non-static
instantiate
MyMethods mm = MyMethods(); mm.someMethod();
使用https://en.wikipedia.org/wiki/Strategy_pattern中所述的 策略模式 (代码随附于此)。
使用https://en.wikipedia.org/wiki/Dependency_injection#Java中所述的 依赖项注入
Problems:
1.a. 并发 调用或多个类是否会有问题?特别JDBC static methods是一个例子?
JDBC static methods
1.b. 我认为这将导致过多的 内存负载, 因为仅调用一个或两个方法 就 需要花费instanticated很多时间。
instanticated
多数民众赞成在我头上,请解释一下和/或任何优点/缺点
我 也没有 想 用一个框架 在上下文中对这个问题..在我头上那顺便说一下,解释和或任何优势/劣势
等待任何其他策略或建议(如果有)。
Request: 请仅在有经验的情况下回答,并深刻理解其含义,并能以您的回答全面帮助我和整个社区!
Request:
Code:
/** The classes that implement a concrete strategy should implement this. * The Context class uses this to call the concrete strategy. */ interface Strategy { int execute(int a, int b); } /** Implements the algorithm using the strategy interface */ class Add implements Strategy { public int execute(int a, int b) { System.out.println("Called Add's execute()"); return a + b; // Do an addition with a and b } } class Subtract implements Strategy { public int execute(int a, int b) { System.out.println("Called Subtract's execute()"); return a - b; // Do a subtraction with a and b } } class Multiply implements Strategy { public int execute(int a, int b) { System.out.println("Called Multiply's execute()"); return a * b; // Do a multiplication with a and b } } // Configured with a ConcreteStrategy object and maintains // a reference to a Strategy object class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int a, int b) { return this.strategy.execute(a, b); } } /** Tests the pattern */ class StrategyExample { public static void main(String[] args) { Context context; // Three contexts following different strategies context = new Context(new Add()); int resultA = context.executeStrategy(3,4); context = new Context(new Subtract()); int resultB = context.executeStrategy(3,4); context = new Context(new Multiply()); int resultC = context.executeStrategy(3,4); System.out.println("Result A : " + resultA ); System.out.println("Result B : " + resultB ); System.out.println("Result C : " + resultC ); } }
您的问题实际上有两个含义。
必须在许多类中多次重用
它可以是设计模式(可重用组件)或内存成本(类实例化)的上下文。从两种不同的角度谈:
本节实际上仅涵盖2种实例化。
首先是静态的(或合成根中的DI实例化)
非静态
简而言之,如果类很多,那么静态将花费很高,而如果请求很高(例如,在循环内部),则非静态将花费很高。但这不应该使您的应用程序繁重。尽管在Java / csharp中,大多数操作都是创建对象。
1-巨型单片代码(一个神职人员几乎可以完成所有工作)
优点:
缺点:
1a /静态类/单例模式
2策略模式
实际上,它的设计与3或相同composition over inheritance。
composition over inheritance
3依赖注入
Must be stateless
我认为状态在您的应用程序设计中起着重要的规则。通常,开发人员尝试避免在业务逻辑代码中包含状态,例如:
// get data if(request.IsDraft){ // step 1 // step 2 } else{ // step 1 // step 3 }
开发人员倾向于将逻辑放在其他stateless类中,或者至少将诸如以下方法:
stateless
// get data if(request.IsDraft){ draftRequestHandler.Modify(request); } else{ publishedRequestHandler.Modify(request); }
它将提供更好的可读性,并且更易于修改和单元测试。也有一种设计模式state pattern or hierarchial state machine pattern,特别是处理这样的情况。
state pattern or hierarchial state machine pattern
恕我直言,如果遵循这一原则,则将带来最大的好处。优点是:
这种设计不能保证您的代码没有错误。考虑到在设计阶段花费时间和分层工作,它具有以下优点:
服务定位器反模式
使用Decorator处理横切关注点
这些设计和策略不是决定您的应用程序结构的关键。仍然由建筑师来决定。我宁愿遵循诸如SOLID,KISS和GRASP之类的原则,而不是确定最佳的结构。据说依赖注入遵循了大多数原则,但是过多的抽象和不正确的组件设计将导致滥用单例模式。