我是软件设计模式的新手,并尝试将工厂设计(创意模式)实现在我的应用程序中使用密钥进行加密/解密。
我想确保这是Factory模式,并且如果设计不好。另外,如果您可以帮助改善它。
我的代码如下:
抽象基类:
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));
}
}
非常感谢您抽出宝贵的时间来回答问题。
答案 0 :(得分:1)
工厂模式[1]是隐藏和简化对象创建的一种方法。例如,如果您有EncryptDecrypt
个算法的许多实现,并且每个算法都有不同的初始化和配置,那么对于用户来说,将很难使用这些实现,因为存在太多和不同的配置,并且无法使用它们。用户将需要阅读大量信息,以了解如何创建所需的对象。因此,工厂模式有助于提供独特的接口,用户可以在其中使用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和Key)的创建,他甚至不必知道那些对象是否存在。
所以,我的回答是EncryptDecrypt
不是工厂,为了做到这一点,您需要将对象用法的对象创建(工厂)分开。
引用: