解耦工厂以允许自定义工厂实现

时间:2016-04-03 18:07:30

标签: java design-patterns factory abstract-factory

我目前正在开发一个库,我试图通过尽可能多地使用接口来抽象部分代码。但是有些区域需要返回具体结果,因为我看不到以干净的方式返回数据的其他方法。例如,一个代码区域需要返回一个密钥对象:

public IKey GenerateKey() {
    return new Key(param1, param2, param3);
}

我目前的解决方案是使用静态方法创建一个Factory类来返回结构:

public IKey GenerateKey() {
    return KeyFactory.Get(param1, param2, param3);
}

但是现在我觉得我在工厂和代码库之间有很高的耦合,因为很多部分都有几行从工厂请求对象。它也只是感觉很懒,因为我可以掀起一些工厂功能,在很多情况下给我一个具体的课程。

我最大的问题是允许人们通过创建自己的实现当前接口的类来替换类。我需要允许用户为他们的OWN类实现创建他们的OWN工厂。如果我为我的工厂制作一个接口,并允许用户创建自己的工厂实现接口,那么我需要一个更高级的工厂来创建那个工厂,等等......

我需要用户能够创建自己的自定义类来实现正确的接口,创建自己的工厂,可以在需要的其他代码区域返回自定义类,并且它们可以无缝地一起工作。

编辑:这是我目前的想法,但是在Java中使用库时,注入工厂似乎是一件非传统的事情。

public class Key implements IKey {
    public Key(param1) {
        //do something
    }
    //other methods
}

public interface IKey{
    //Other methods
}

public class RicksFactory {
    public IKey getKey(param1) {
        return new Key(param1);
    }
}

public interface IFactory {
    IKey getKey(param1);
}

//This class is a singleton, for other classes in
//library to find it without having to do dependency
//injection down all the levels of classes.
public class TopClassInLibrary {
    //Singleton init

    public void SetFactory(IFactory factory) {
        this.factory = factory;
    }

    public IFactory GetFactory() {
        return new RicksFactory();
    }
}

public class Main {
    public static void main(String[] args) {
        TopClassInLibrary.GetInstance().SetFactory(new RicksFactory());

    }
}

**编辑2:**我想我现在已经找到了一个很好的解决方案,如果有人能告诉我它的好坏,我会很感激吗?感谢

public class Key implements IKey {
    public Key(param1) {
        //do something
    }
    //other methods
}

public interface IKey{
    //Other methods
}

public class RicksFactory {
    public IKey getKey(param1) {
        return new Key(param1);
    }
}

public interface IFactory {
    IKey getKey(param1);
}

public class TopClassInLibrary {
    private static TopClassInLibrary topClass;
    private static TopClassInLibrary GetInstance() {
        if(topClass == null)
            topClass = new TopClassInLibrary();
        return topClass;
    }

    private IFactory factory;

    public void SetFactory(IFactory factory) {
        this.factory = factory;
    }

    public IFactory GetFactory() {
        if(factory == null)
            factory = new RicksFactory();
        return factory;
    }
}

public class Main {
    public static void main(String[] args) {
        //Below not needed now for default implementation
        //TopClassInLibrary.GetInstance().SetFactory(new RicksFactory());
        IKey myKey = TopClassInLibrary.GetFactory().getKey(param1);
    }
}

因此,在此设置中,TopClassInLibrary永远不需要使用库来实例化或触摸外部代码,因为它在请求时创建自己的实例,并且如果尚未设置自定义实例,则创建默认工厂。

1 个答案:

答案 0 :(得分:0)

您的解决方案是abstract factory pattern,完全符合您的情况。