首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将属性传递给工厂方法

将属性传递给工厂方法
EN

Stack Overflow用户
提问于 2016-01-12 00:26:35
回答 4查看 2.1K关注 0票数 4

我有一个工厂方法,它返回接口的实现。问题是-实现有不同的构造函数参数。

我的问题是-如何通过工厂方法将参数传递给接口的不同实现?

我有一个想法,但我不确定它是否有意义--将Properties对象传递给工厂方法?通过这种方式,每个接口实现都可以获得其构造函数所需的属性,而工厂接口将是统一的。

这是有意义的,还是有更好的解决方案?

我决定加一个例子,这样我就可以更好地澄清这个问题。

假设我们有接口SomeAlgorithm,我们有具体的算法,其中每个算法可能有不同的参数,例如

代码语言:javascript
运行
复制
SomeAlgorithm algo = new Algo1();
SomeAlgorithm algo = new Algo2(noOfIterations);
SomeAlgorithm algo = new Algo3(precision, boundary);

我希望能够做一些事情,比如

代码语言:javascript
运行
复制
SomeAlgorithm algo = AlgoFactory.getAlgo("algoName");

我处理不同参数的方法是

代码语言:javascript
运行
复制
SomeAlgorithm algo = AlgoFactory.getAlgo("algoName", properties); 

然后,如果算法有参数(例如Algo1没有参数),AlgoFactory可以将适当的属性传递给具体的算法构造函数。如果某些属性不存在,则可以传递默认值(如果算法中需要该值)。

如你所见,我希望能够动态改变算法。用户在运行时选择算法,并传递适当的参数,这些参数将放入属性对象中。

这有意义吗?

EN

Stack Overflow用户

发布于 2016-01-13 03:27:00

我认为你需要实现Builder模式。

构建器模式是一种对象创建软件设计模式。与旨在支持多态性的抽象工厂模式和工厂方法模式不同,构建器模式的意图是找到所需的伸缩构造函数反模式引用的解决方案。

当对象构造函数参数组合的增加导致构造函数的指数列表时,就会发生伸缩构造函数反模式。

构建器模式不使用许多构造函数,而是使用另一个对象,即构建器,它逐步接收每个初始化参数,然后立即返回得到的构造对象。

看一下这个示例代码。

代码语言:javascript
运行
复制
class SomeAlgorithm{
    // Make it or class or interface
}
class Algo extends SomeAlgorithm{
    private int noOfIterations;
    private double precision; 
    private double boundary;

    public Algo(Builder builder){
        this.noOfIterations = builder.noOfIterations;
        this.precision= builder.precision;
        this.boundary= builder.boundary;
    }
    public String toString(){
        return new StringBuilder("Algo:Iterations:precision:boundary:").append(noOfIterations).append(":").
        append(precision).append(":").append(boundary).toString();
    }
    static class Builder {
        private int noOfIterations; // Mandatory parameter
        private double precision = 1.0; // Optional parameter
        private double boundary = 2.0; // Optional parameter

        public Builder ( int noOfIterations){
            this.noOfIterations = noOfIterations;
        }
        public Builder precision(double precision){
            this.precision = precision;
            return this;
        }
        public Builder boundary(double boundary){
            this.boundary = boundary;
            return this;
        }
        public Algo build(){
            return new Algo(this);
        }
    }
}
public class BuilderDemo{
    public static void main(String args[]){
        Algo algo = new Algo.Builder(2).precision(3.0).boundary(4.0).build();
        System.out.println(algo);
        algo = new Algo.Builder(10).build();
        System.out.println(algo);
    }
}

输出:

代码语言:javascript
运行
复制
java BuilderDemo 2
Algo:Iterations:precision:boundary:2:3.0:4.0
Algo:Iterations:precision:boundary:10:1.0:2.0

如果您必须使用相同的构造函数参数集来实现工厂方法&而不使用if-else语句,那么可以看看

但我更倾向于实现同样的结果:

代码语言:javascript
运行
复制
public static Algo newInstance(String algoClassType) {
    return Class.forName(algoClassType).newInstance();      
}
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34726422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档