首先先看一下抽象产品和具体产品类(Product)
药品类
package com;
/**
* 药品
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public abstract class Medicine {
public abstract void getName();
public abstract void getNum();
}
西药类
package com;
/**
* 西药
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class XMedicine extends Medicine {
@Override
public void getName() {
System.out.println("我是西药");
}
@Override
public void getNum() {
System.out.println("西药的数量为2");
}
}
中药类
package com;
/**
* 中药
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class ZMedicine extends Medicine {
@Override
public void getName() {
System.out.println("我是中药");
}
@Override
public void getNum() {
System.out.println("中药的数量为2");
}
}
仪器类
package com;
/**
* 仪器
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public abstract class Machine {
public abstract void getName();
public abstract void getNum();
}
西药仪器类
package com;
/**
* 西药仪器
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class XMachine extends Machine{
@Override
public void getName() {
System.out.println("我是西药仪器");
}
@Override
public void getNum() {
System.out.println("西药仪器的数量为3");
}
}
中药仪器类
package com;
/**
* 中药仪器
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class ZMachine extends Machine{
@Override
public void getName() {
System.out.println("我是中药仪器");
}
@Override
public void getNum() {
System.out.println("中药仪器的数量为3");
}
}
1、简单工厂模式
工厂类
package com.design;
import com.XMedicine;
import com.ZMedicine;
/**
* 简单工厂类
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class Factory {
public static XMedicine xNewInstance() {
return new XMedicine();
}
public static ZMedicine zNewInstance() {
return new ZMedicine();
}
}
测试类
package com.design;
import com.XMedicine;
import com.ZMedicine;
/**
* 简单工厂测试类
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class FactoryTest {
public static void main(String[] arg) {
XMedicine xMedicine = Factory.xNewInstance();
ZMedicine zMedicine = Factory.zNewInstance();
xMedicine.getName();
xMedicine.getNum();
zMedicine.getNum();
zMedicine.getName();
}
}
2、工厂方法模式
抽象工厂类
package com.design1;
import com.Medicine;
/**
* description
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public abstract class Factory {
public abstract Medicine newInstance();
}
西药工厂类
package com.design1;
import com.Medicine;
import com.XMedicine;
/**
* description
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class XMedicineFactory extends Factory{
@Override
public Medicine newInstance() {
return new XMedicine();
}
}
中药工厂类
package com.design1;
import com.Medicine;
import com.ZMedicine;
/**
* description
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class ZMedicineFactory extends Factory{
@Override
public Medicine newInstance() {
return new ZMedicine();
}
}
测试类
package com.design1;
import com.Medicine;
/**
* 工厂方法测试类
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class FactoryMethodTest {
public static void main(String[] arg) {
XMedicineFactory xMedicineFactory = new XMedicineFactory();
Medicine xMedicine = xMedicineFactory.newInstance();
xMedicine.getName();
xMedicine.getNum();
ZMedicineFactory zMedicineFactory = new ZMedicineFactory();
Medicine zMedicine = zMedicineFactory.newInstance();
zMedicine.getNum();
zMedicine.getName();
}
}
3、抽象工厂模式
抽象工厂类
package com.design2;
import com.Machine;
import com.Medicine;
/**
* description
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public abstract class Factory {
public abstract Medicine medicineNewInstance();
public abstract Machine machineNewInstance();
}
西药工厂类
package com.design2;
import com.Machine;
import com.Medicine;
import com.XMachine;
import com.XMedicine;
/**
* description
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class XMedicineFactory extends Factory{
@Override
public Medicine medicineNewInstance() {
return new XMedicine();
}
@Override
public Machine machineNewInstance() {
return new XMachine();
}
}
中药工厂类
package com.design2;
import com.Machine;
import com.Medicine;
import com.ZMachine;
import com.ZMedicine;
/**
* description
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class ZMedicineFactory extends Factory{
@Override
public Medicine medicineNewInstance() {
return new ZMedicine();
}
@Override
public Machine machineNewInstance() {
return new ZMachine();
}
}
测试类
package com.design2;
import com.Machine;
import com.Medicine;
/**
* 抽象工厂方法测试类
*
* @author ZHANGHAOHAO089
* @date 2017/12/13
*/
public class AbstractFactoryTest {
public static void main(String[] arg) {
ZMedicineFactory zMedicineFactory = new ZMedicineFactory();
Medicine zMedicine = zMedicineFactory.medicineNewInstance();
Machine zMachine = zMedicineFactory.machineNewInstance();
zMedicine.getName();
zMedicine.getNum();
zMachine.getName();
zMachine.getNum();
XMedicineFactory xMedicineFactory = new XMedicineFactory();
Medicine xMedicine = xMedicineFactory.medicineNewInstance();
Machine xMachine = xMedicineFactory.machineNewInstance();
xMedicine.getName();
xMedicine.getNum();
xMachine.getName();
xMachine.getNum();
}
}
小结:
1、简单工厂模式:只是简单的生产产品,当有额外的产品需要生产,必须修改工厂类。扩展比较繁琐,后期代码比较混乱。
2、工厂方法模式:根据不同的产品,有自己的具体工厂实现类,当有额外的产品需要生产,只需要增加新工厂即可,易扩展。
3、抽象工厂模式:针对多个相似的厂生产多个相似的产品,有产品群的概念。工厂方法是单一的产品。