正好要做一个读取本机IP和MAC地址的练习,发现windows下和linux的不一样,于是干脆一起来做工厂模式练习~不过返回都是String - -。
首先是IPReader接口和MACReader接口,表示可以读取IP和MAC的行为:
- package net.reader;
- public interface IPReader {
- public String getIP();
- }
- package net.reader;
- public interface MACReader {
- public String getMAC();
- }
Windows下的实现类
- package net.reader;
- import java.net.InetAddress;
- import java.net.UnknownHostException;
- public class WindowsIPReader implements IPReader {
- public String getIP() {
- String ip;
- try {
- ip = InetAddress.getLocalHost().getHostAddress();
- } catch (UnknownHostException e) {
- ip = "Can not read ip!";
- e.printStackTrace();
- }
- return ip;
- }
- }
- package net.reader;
- import java.io.*;
- public class WindowsMACReader implements MACReader {
- public String getMAC() {
- String mac = null;
- try {
- Process p = Runtime.getRuntime().exec("ipconfig /all");
- BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
- String s, str = "";
- while((s=br.readLine())!=null){
- if(s.contains("Physical Address")){
- mac = s.substring(44);
- break;
- }
- }
- } catch (IOException e) {
- mac = "Cannot read MAC Address!";
- e.printStackTrace();
- }
- return mac;
- }
- }
Linux下的实现类
- package net.reader;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class LinuxIPReader implements IPReader {
- public String getIP() {
- String ip = null;
- try {
- Process p = Runtime.getRuntime().exec("ifconfig");
- BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
- String s, str = "";
- while((s=br.readLine())!=null){
- if(s.contains("inet addr")){
- ip = s.substring(20,35);
- break;
- }
- }
- } catch (IOException e) {
- ip = "Cannot read IP Address!";
- e.printStackTrace();
- }
- return ip;
- }
- }
- package net.reader;
- import java.io.*;
- public class LinuxMACReader implements MACReader {
- public String getMAC() {
- String mac = null;
- try {
- Process p = Runtime.getRuntime().exec("ifconfig");
- BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
- String s, str = "";
- while((s=br.readLine())!=null){
- if(s.contains("HWaddr")){
- mac = s.substring(35);
- break;
- }
- }
- } catch (IOException e) {
- mac = "Cannot read MAC Address!";
- e.printStackTrace();
- }
- return mac;
- }
- }
然后是抽象工厂
- package net.factory;
- public abstract class NetFactory {
- public abstract String getIP();
- public abstract String getMAC();
- }
Windows实现类
- package net.factory;
- import net.reader.WindowsIPReader;
- import net.reader.WindowsMACReader;
- public class WindowsFactory extends NetFactory {
- @Override
- public String getIP() {
- return new WindowsIPReader().getIP();
- }
- @Override
- public String getMAC() {
- return new WindowsMACReader().getMAC();
- }
- }
Linux实现类
- package net.factory;
- import net.reader.LinuxIPReader;
- import net.reader.LinuxMACReader;
- public class LinuxFactory extends NetFactory {
- @Override
- public String getIP() {
- return new LinuxIPReader().getIP();
- }
- @Override
- public String getMAC() {
- return new LinuxMACReader().getMAC();
- }
- }
最后是一个创建工厂的工厂 = =
- package net.factory;
- public class SystemFactory {
- public static NetFactory getInstance(){
- String os = System.getProperty("os.name");
- if(os==null){
- return null;
- }
- if(os.startsWith("Windows")){
- return new WindowsFactory();
- }
- if(os.startsWith("Linux")){
- return new LinuxFactory();
- }
- return null;
- }
- }
输出部分:
- package net;
- import net.factory.*;
- public class NetProgramTest {
- public static void main(String[] args) {
- try{
- NetFactory factory = SystemFactory.getInstance();
- System.out.println("IP: " + factory.getIP());
- System.out.println("MAC Address: " + factory.getMAC());
- }catch(Exception e){
- System.out.println("Cannot read System Info!");
- }
- }
- }
在winXP和redhat9.0下测试可行~