简单工厂的应用场景
工程中需要用到复杂对象的,像电脑,分为苹果,戴尔,联想等,每个电脑的品牌不同,系统不同。
简单工厂的示例
- 创建一个电脑的抽象类,定义电脑的一些共有的属性,如开机启动,一些特有的属性通过抽象方法实现如系统,品牌等
/**
* <pre>
* 项目名称:ModeNote
* 类名称:Computer 类,抽象产品类,具体的实现细节通过子类实现
* 类描述:
* 创建人:bd_liang
* 创建时间:Feb 17, 2017 3:40:56 PM
* 修改人:bd_liang
* 修改时间:Feb 17, 2017 3:40:56 PM
* 修改备注:
* @version 1.0
*
* <pre>
*/
public abstract class Computer {
/**
* 获取电脑的系统
*/
public abstract void getOS();
/**
* 获取电脑的品牌
*/
public abstract void getBrand();
/**
* 开机
*/
public void start(String param) {
System.out.println("------" + param + "启动了-----");
}
}
- 创建一些特有的属性通过接口实现,(抽象类与接口的区别就是共有的通过抽象方法,特有的通过接口),表述不是很确切,就想有的电脑都需要有系统、主机等,只是品牌不同,但有的电脑有CD驱动,有的没有。系统、主机的属性可以通过抽象类定义,子类定义具体的操作系统或者型号以及是否需要安装CD驱动(是否实现该接口)。
/**
* <pre>
* 项目名称:ModeNote
* 类名称:ICDDriver
* 类描述:光驱接口
* 创建人:bd_liang
* 创建时间:Feb 17, 2017 3:30:38 PM
* 修改人:bd_liang
* 修改时间:Feb 17, 2017 3:30:38 PM
* 修改备注:1.0
* @version
*
* <pre>
*/
public interface ICDDriver {
/**
* 播放CD
*/
public void playCD();
}
- 创建具体的产品类A:戴尔电脑。
/**
* <pre>
* 项目名称:ModeNote
* 类名称:DellComputer ,具体的产品类
* 类描述:
* 创建人:bd_liang
* 创建时间:Feb 17, 2017 3:46:55 PM
* 修改人:bd_liang
* 修改时间:Feb 17, 2017 3:46:55 PM
* 修改备注:
* @version 1.0
*
* <pre>
*/
public class DellComputer extends Computer implements ICDDriver {
/*
* (non-Javadoc)
*
* @see com.study.factory.Computer#getOS()
*/
@Override
public void getOS() {
// TODO Auto-generated method stub
System.out.println("OS:: Windows");
}
/*
* (non-Javadoc)
*
* @see com.study.factory.Computer#getBrand()
*/
@Override
public void getBrand() {
// TODO Auto-generated method stub
System.out.println("Banrd::Dell ");
}
/*
* (non-Javadoc)
*
* @see com.study.factory.ICDDriver#playCD()
*/
@Override
public void playCD() {
// TODO Auto-generated method stub
System.out.println("play the CD! ");
}
}
- 创建具体的产品类B:苹果电脑。
/**
* <pre>
* 项目名称:ModeNote
* 类名称:MacComputer ,具体的产品类
* 类描述:
* 创建人:bd_liang
* 创建时间:Feb 17, 2017 3:52:24 PM
* 修改人:bd_liang
* 修改时间:Feb 17, 2017 3:52:24 PM
* 修改备注:
* @version
*
* <pre>
*/
public class MacComputer extends Computer {
/*
* (non-Javadoc)
*
* @see com.study.factory.Computer#getOS()
*/
@Override
public void getOS() {
// TODO Auto-generated method stub
System.out.println("OS:: Mac");
}
/*
* (non-Javadoc)
*
* @see com.study.factory.Computer#getBrand()
*/
@Override
public void getBrand() {
// TODO Auto-generated method stub
System.out.println("Brand :: 苹果");
}
}
- 创建电脑生产厂家,简单工厂模式直接根据传入的参数生产相应的品牌电脑,不创建抽象工厂类,在根据不同的品牌去创建不同的产品工厂了。实际的需求应该是定义一个抽象工厂(泛型),苹果厂商、戴尔厂商分别是不同的生产工厂。。。
/**
* <pre>
* 项目名称:ModeNote
* 类名称:ComputerFactory
* 类描述: 电脑工厂
* 创建人:bd_liang
* 创建时间:Feb 17, 2017 3:55:47 PM
* 修改人:bd_liang
* 修改时间:Feb 17, 2017 3:55:47 PM
* 修改备注:
* @version 1.0
*
* <pre>
*/
public class ComputerFactory {
/**
* 利用反射机制,根据传入的参数生产具体的产品,不用每增加一个产品,就添加一个生产产品的方法
*
* @param clz
* @return
*/
public static <T extends Computer> T getComputer(Class<T> clz) {
Computer computer = null;
try {
computer = (Computer) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T) computer;
}
}
/**
* <pre>
* 项目名称:ModeNote
* 类名称:Test
* 类描述:
* 创建人:bd_liang
* 创建时间:Feb 17, 2017 4:01:46 PM
* 修改人:bd_liang
* 修改时间:Feb 17, 2017 4:01:46 PM
* 修改备注:
* @version
*
* <pre>
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DellComputer dellComputer = ComputerFactory
.getComputer(DellComputer.class);
dellComputer.start(DellComputer.class.getSimpleName());
dellComputer.getBrand();
dellComputer.getOS();
dellComputer.playCD();
MacComputer macComputer = ComputerFactory
.getComputer(MacComputer.class);
macComputer.start(MacComputer.class.getSimpleName());
macComputer.getBrand();
macComputer.getOS();
}
}
测试结果如下:
------DellComputer启动了-----
Banrd::Dell
OS:: Windows
play the CD!
------MacComputer启动了-----
Brand :: 苹果
OS:: Mac