设计模式:工厂模式
spring: IOC和AOP
IOC:面向接口(抽象)编程,不是面向具体编程xml解析: DOM, JDOM, DOM4J, SAX
1.普通工厂模式
普通工厂:可以在产品的维度上扩展,每种产品都new一个新工厂,会产生工厂泛滥的现象
package com.bjsxt.dp.factory;
public class Broom implements Moveable {
@Override
public void run() {
System.out.println("一路沙尘暴飞奔而来broom.....");
}
}
package com.bjsxt.dp.factory;
public class BroomFactory extends VehicleFactory{
public Moveable create() {
return new Broom();
}
}
package com.bjsxt.dp.factory;
import java.util.ArrayList;
import java.util.List;
public class Car implements Moveable{
private static Car car = new Car();
//private static List<Car> cars = new ArrayList<Car>();
public Car(){}
public static Car getInstance() {
return car;
}
public void run() {
System.out.println("冒着烟奔跑中car.......");
}
}
package com.bjsxt.dp.factory;
public class CarFactory extends VehicleFactory{
public Moveable create() {
return new Car();
}
}
package com.bjsxt.dp.factory;
public interface Moveable {
void run();
}
package com.bjsxt.dp.factory;
public class Plane implements Moveable {
@Override
public void run() {
System.out.println("扇着翅膀前进中plane....");
}
}
package com.bjsxt.dp.factory;
public class PlaneFactory extends VehicleFactory{
public Moveable create() {
return new Plane();
}
}
package com.bjsxt.dp.factory;
public abstract class VehicleFactory {
abstract Moveable create();
}
package com.bjsxt.dp.factory;
public class Test {
public static void main(String[] args) {
//Car c = Car.getInstance();
//Car c2 = Car.getInstance();
VehicleFactory factory = new BroomFactory();
Moveable m = factory.create();
//if(c == c2) System.out.println("same car");
m.run();
}
}
2.抽象工厂模式
抽象工厂:可以在产品系列的维度上扩展,可以解决工厂泛滥的现象,在产生新的工厂品种的时候,改动也很多。
package com.bjsxt.dp.factory.abstractfactory;
public abstract class AbstractFactory {
public abstract Vehicle createVehicle();
public abstract Weapon createWeapon();
public abstract Food createFood();
}
package com.bjsxt.dp.factory.abstractfactory;
public class AK47 extends Weapon{
public void shoot() {
System.out.println("哒哒哒...");
}
}
package com.bjsxt.dp.factory.abstractfactory;
public class Apple extends Food {
public void printName() {
System.out.println("apple");
}
}
package com.bjsxt.dp.factory.abstractfactory;
public class Broom extends Vehicle{
public void run() {
System.out.println("一路沙尘暴飞奔而来broom.....");
}
}
package com.bjsxt.dp.factory.abstractfactory;
public class Car extends Vehicle {
public void run() {
System.out.println("冒着烟奔跑中car.......");
}
}
package com.bjsxt.dp.factory.abstractfactory;
public class DefaultFactory extends AbstractFactory{
@Override
public Food createFood() {
// TODO Auto-generated method stub
return new Apple();
}
@Override
public Vehicle createVehicle() {
// TODO Auto-generated method stub
return new Car();
}
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new AK47();
}
}
package com.bjsxt.dp.factory.abstractfactory;
public abstract class Food {
public abstract void printName();
}
package com.bjsxt.dp.factory.abstractfactory;
public class MagicFactory extends AbstractFactory {
@Override
public Food createFood() {
// TODO Auto-generated method stub
return new MushRoom();
}
@Override
public Vehicle createVehicle() {
// TODO Auto-generated method stub
return new Broom();
}
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new MagicStick();
}
}
package com.bjsxt.dp.factory.abstractfactory;
public class MagicStick extends Weapon {
@Override
public void shoot() {
System.out.println("fire hu hu hu ...");
}
}
package com.bjsxt.dp.factory.abstractfactory;
public class MushRoom extends Food {
@Override
public void printName() {
// TODO Auto-generated method stub
System.out.println("mushroom");
}
}
package com.bjsxt.dp.factory.abstractfactory;
public abstract class Vehicle {
public abstract void run();
}
package com.bjsxt.dp.factory.abstractfactory;
public abstract class Weapon {
public abstract void shoot();
}
package com.bjsxt.dp.factory.abstractfactory;
public class Test {
public static void main(String[] args) {
//DefaultFactory f = new DefaultFactory();
AbstractFactory f = new DefaultFactory();
Vehicle v = f.createVehicle();
v.run();
Weapon w = f.createWeapon();
w.shoot();
Food a = f.createFood();
a.printName();
}
}
3.通过配置文件实现工厂模式(JDOM)
sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk>
<disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class Sample2 {
public static void main(String[] args) throws Exception {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(Sample2.class.getClassLoader().getResourceAsStream("sample.xml"));
Element root = doc.getRootElement();
System.out.println(root);
List list = XPath.selectNodes(root, "/HD/disk");
System.out.println(list.size());
for (int i = 0; i > list.size(); i++) {
Element disk_element = (Element) list.get(i);
String name = disk_element.getAttributeValue("name");
String capacity = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/capacity/text()")).getTextNormalize();
String directories = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/directories/text()")).getTextNormalize();
String files = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/files/text()")).getTextNormalize();
System.out.println("磁盘信息:");
System.out.println("分区盘符:" + name);
System.out.println("分区容量:" + capacity);
System.out.println("目录数:" + directories);
System.out.println("文件数:" + files);
System.out.println("-----------------------------------");
}
}
}