工厂设计模式
设计模式:特定问题的固定解决方法
工厂设计模式:
- 主要负责对象创建的问题
- 开发中有一个长要的原则“开闭原理”,对拓展开发,对修改关闭
- 可以通过反射进行工厂设计模式的设计,完成动态的对象创建
/**
* 父类产品
* @author ASUS
*
*/
public interface Usb {
void service();
}
public class Upan implements Usb{
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("u盘开始工作了.....");
}
}
public class Mouse implements Usb{
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("鼠标开始工作了....");
}
}
public class Fan implements Usb{
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("风扇开始关注了....");
}
}
/**
* 工厂类
*
* @author ASUS
*
*/
public class UsbFactory {
public static Usb createUsb(int type) {
Usb usb = null; // 创建一个对象
if (type == 1) { // 1:鼠标
usb = new Mouse();
} else if (type == 2) { // 2:风扇
usb = new Fan();
} else if (type == 3) { // 3:U盘
usb = new Upan();
}
// 如果都不满足,即空,返回一个usb对象
return usb;
}
}
/**
* 客户程序
* @author ASUS
*
*/
public class Demo {
public static void main(String[] args) {
System.out.println("============== 请选择 1鼠标 2风扇 3U盘 =============");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
Usb usb = UsbFactory.createUsb(n);
if (usb != null) {
System.out.println("购买成功");
usb.service();
}else {
System.out.println("购买失败,你要买的不存在");
}
}
}
添加一个产品:键盘
public class KeyBoard implements Usb{
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("键盘开始工作了....");
}
}
得修改代码
/**
* 工厂类
*
* @author ASUS
*
*/
public class UsbFactory {
public static Usb createUsb(int type) {
Usb usb = null; // 创建一个对象
// 每增加一个产品就得增加一个else-if,不符合开闭原则
if (type == 1) { // 1:鼠标
usb = new Mouse();
} else if (type == 2) { // 2:风扇
usb = new Fan();
} else if (type == 3) { // 3:U盘
usb = new Upan();
}else if (type == 4) { // 4:键盘
usb = new KeyBoard();
}
// 如果都不满足,即空,返回一个usb对象
return usb;
}
}
不符合开闭原则:下面使用反射进行优化
- 反射获取对象
public class UsbFactory {
public static Usb createUsb(String type) { // 表示全限定类名
Usb usb = null; // 创建一个对象
Class<?> class1 = null;
try {
class1 = Class.forName(type);
// 创建一个对象
usb = (Usb)class1.newInstance();
} catch (Exception e) {
System.out.println(e.getMessage());
}
// 如果都不满足,即空,返回一个usb对象
return usb;
}
}
1 : gc.Mouse
2 : gc.Fan
3 : gc.Upan
4 : gc.KeyBoard
==> 把这些放到属性文件中:可以使用Properties类
创建Properties文件:usb.properties
1=gc.Mouse
2=gc.Fan
3=gc.Upan
4=gc.KeyBoard
gc
:是包名
/**
* 客户程序
* @author ASUS
*
*/
public class Demo {
public static void main(String[] args) throws Exception {
System.out.println("============== 请选择 1鼠标 2风扇 3U盘 =============");
Scanner input = new Scanner(System.in);
String n = input.next();
/**
* 1 : gc.Mouse
* 2 : gc.Fan
* 3 : gc.Upan
* 4 : gc.KeyBoard
* ==> 把这些放到属性文件中:可以使用Properties类
*/
Properties properties = new Properties();
// 创建一个输入流
FileInputStream fis = new FileInputStream("src/uab.properties");
// 加载流
properties.load(fis);
fis.close();
Usb usb = UsbFactory.createUsb(properties.getProperty(n));
if (usb != null) {
System.out.println("购买成功");
usb.service();
}else {
System.out.println("购买失败,你要买的不存在");
}
}
}
如果后面还有加一个产品(实现类),直接在属性文件修改即可