Реализация шаблона фабрики - PullRequest
0 голосов
/ 10 января 2019

В настоящее время я занят внедрением 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: я удалил две интерфейсные функции из классов, чтобы предотвратить много кода.

EDIT:

Когда я создаю экземпляр RSA, например:

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

У меня нет доступа к методам в интерфейсе?

Ответы [ 2 ]

0 голосов
/ 10 января 2019
  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);
}
0 голосов
/ 10 января 2019

Используйте шаблон Factory Method, когда

1.a класс не может предвидеть класс объектов, которые он должен создать

2.а класс хочет, чтобы его подклассы указывали объекты, которые он создает

3.классы делегируют ответственность одному из нескольких вспомогательных подклассов, и вы хотите локализовать сведения о том, какой подкласс помощника является делегатом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...