Мой код реализует шаблон Factory? Это плохой дизайн? - PullRequest
0 голосов
/ 05 января 2019

Я новичок в шаблонах проектирования программного обеспечения и пробую фабричный дизайн (шаблон создания) реализовать в моем приложении для шифрования / дешифрования с использованием ключа.

Я хочу убедиться, что это фабричный шаблон, и если это плохой дизайн. Также, если вы можете помочь, как улучшить его.

Мой код следующий:

абстрактный базовый класс:

public abstract class EncryptDecrypt {
protected Key getKey() {
    Key key = new SecretKeySpec(getKeyValue().getBytes(), getAlgorithm());
    return key;
}
protected Cipher getCipher() throws NoSuchAlgorithmException, NoSuchPaddingException {
    Cipher c = Cipher.getInstance(getAlgorithm());
    return c;
}

protected abstract String getKeyValue();
protected abstract String getAlgorithm();

public final String encryptText(String valueToEnc) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
    String keyValue = getKeyValue();
    String algorithm = getAlgorithm();
    Key key = getKey();
    Cipher c = getCipher();
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new String(Base64.getEncoder().encode(encValue));
    return encryptedValue;
}

public final String decryptText(String encryptedValue) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
    String keyValue = getKeyValue();
    String algorithm = getAlgorithm();
    Key key = getKey();
    Cipher c = getCipher();
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = Base64.getDecoder().decode(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}
}

и ниже приведен пример реализации AES:

public class AESEncryptDecrypt extends EncryptDecrypt {

@Override
protected String getKeyValue() {
    return "ThisIsA Key 1234";
}

@Override
protected String getAlgorithm() {
    return "AES";
}
}

Класс клиента:

public class Test {

public static void main(String[] args) throws Exception {
    EncryptDecrypt ed = new AESEncryptDecrypt();
    String msg = "Text message@yahoo.com";
    String e = ed.encryptText(msg);
    System.out.println(e);
    System.out.println(ed.decryptText(e));
}

}

Большое спасибо, что нашли время ответить.

1 Ответ

0 голосов
/ 07 января 2019

Заводской шаблон [1] - это способ скрыть и упростить создание объекта. Например, если у вас есть много реализаций алгоритмов EncryptDecrypt и каждая из них имеет различную инициализацию и конфигурацию, то для пользователя будет сложно использовать эти реализации, потому что их слишком много и с разными конфигурациями, и использовать их пользователь будет Нужно прочитать много информации, чтобы понять, как создать объект, который ему нужен. Таким образом, шаблон Factory помогает предоставить уникальный интерфейс, в котором у пользователя есть все различные реализации алгоритмов и методов EncryptDecrypt для их создания без необходимости знать, как их инициализировать.

Думайте, что вы находитесь в ресторане с тоннами еды и хотите что-то заказать. Как вы думаете, что было бы, если бы не было меню? Вам нужно будет проверить все виды пищи и приготовлений, чтобы выяснить, что вы хотите. Фабрика работает как меню, в котором все параметры объединены и организованы для удобства использования.

Теперь, если вы посмотрите EncryptDecrypt использование

EncryptDecrypt ed = new AESEncryptDecrypt();
String msg = "Text message@yahoo.com";
String e = ed.encryptText(msg);
System.out.println(e);
System.out.println(ed.decryptText(e));

Вы заметите, что он не создает никаких объектов, он не похож на меню. На самом деле EncryptDecrypt сам является объектом, который выполняет всю работу. Но с другой стороны у вас есть

protected Key getKey() {
    Key key = new SecretKeySpec(getKeyValue().getBytes(), getAlgorithm());
    return key;
}
protected Cipher getCipher() throws NoSuchAlgorithmException, NoSuchPaddingException {
    Cipher c = Cipher.getInstance(getAlgorithm());
    return c;
}

и это больше похоже на Фабрику, где вы скрываете создание Объекта (Ciper and Key) для пользователя, и ему не нужно даже знать, что эти Объекты существуют.

Итак, мои ответы таковы: EncryptDecrypt не является Фабрикой, и для этого вам необходимо отделить создание Объекта (Фабрику) от использования Объекта.

ссылка:

[1] Википедия, определение фабричного образца .

...