实施工厂模式

时间:2019-01-10 13:05:40

标签: java oop design-patterns

目前,我正忙于将Factory Pattern实施到Java代码中。 我有这些课:

CipherStorage

public class CipherStorage {

    protected String transformation;
    protected String provider;
    protected String providerPair;

    public CipherStorage(String transformation, String provider, String providerPair){
        this.transformation = transformation;
        this.provider = provider;
        this.providerPair = providerPair;
    }
}

CipherStorageProcessor(接口)

public interface CipherStorageProcessor {
    byte[] encryptData(String keyName, String input, @Nullable SharedPreferences pref);
    byte[] decryptData(String keyName, byte[] encrypted, @Nullable SharedPreferences pref);
}

CipherStorageRSA

public class CipherStorageRSA extends CipherStorage implements CipherStorageProcessor {

    public CipherStorageRSA(String transformation, String provider,String providerPair){
        super(transformation, provider, providerPair);
    }
}

CipherStorageAES

public class CipherStorageAES extends CipherStorage implements CipherStorageProcessor {

    public CipherStorageAES(String transformation, String provider, String providerPair){
        super(transformation, provider, providerPair);
    }
}

CipherStorageFactory

public class CipherStorageFactory {

    public CipherStorage getCipher(String cipherType) {
        if (cipherType == null) {
            return null;
        }
        if (cipherType.equalsIgnoreCase("AES")) {
            return new CipherStorageAES();

        } else if (cipherType.equalsIgnoreCase("RSA")) {
            return new CipherStorageRSA();

        }
    }
}

此代码有意义吗?向工厂添加参数是否正确?有更好的方法吗?

已经感谢您的帮助。

PS:我从类中删除了两个接口函数,以防止编写大量代码。

编辑:

例如,当我创建RSA实例时:

CipherStorage RSA = CipherStorageFactory.getCipher("RSA");

我无法访问界面中的方法吗?

2 个答案:

答案 0 :(得分:2)

  1. 关于工厂模式

您对工厂模式的实现是正确的。

关于具体类的构造函数参数,您可以将它们预先配置到工厂对象中(因为这些参数在工厂创建的不同密码对象中是通用的),并使用它们在工厂方法中创建实例:

public class CipherStorageFactory {
    private String transformation;
    private String provider;
    private String providerPair;

    public CipherStorageFactory(String transformation, String provider, String providerPair){
        this.transformation = transformation;
        this.provider = provider;
        this.providerPair = providerPair;
    }

    public CipherStorage getCipher(String cipherType) {
        //...
        if (cipherType.equalsIgnoreCase("AES")) {
            return new CipherStorageAES(transformation, provider, providerPair);
        } else 
        //...
    }
}

此外,在这种情况下,最好将工厂方法命名为“ createCipher()”,因为它每次都会返回一个新实例。

  1. 关于界面方法

之所以无法访问encryptdata()方法,是因为,您将创建的密码对象强制转换为超级类型(CipherStorage),并且没有这些方法。您可以执行的选择之一是,将2种方法从接口移至CipherStorage并将它们(以及类本身)声明为抽象,在这种情况下,您将不需要接口:

public abstract class CipherStorage {
    public abstract byte[] encryptData(String keyName, String input, @Nullable SharedPreferences pref);
    public abstract byte[] decryptData(String keyName, byte[] encrypted, @Nullable SharedPreferences pref);
}

答案 1 :(得分:1)

在以下情况下使用“工厂方法”模式

1。一个类无法预期它必须创建的对象的类

2。一个类希望其子类指定其创建的对象

3.classes将职责委派给多个帮助程序子类之一,而您想本地化哪个委托程序子类是委托人的知识