Java 23种设计模式之工厂方法模式
程序员文章站
2024-01-05 17:01:10
...
1. 概念
定义一个用于创建对象的接口,让子类决定实例化哪个类。
工厂方法使一个类的实例化延迟到其子类。
2. 创建父类接口
public interface ILeiFeng {
/**
* 扫地
*/
void sweep();
/**
* 洗衣服
*/
void wash();
/**
* 买米
*/
void buyRice();
}
3. 创建产品类实现父类接口
1.产品一:学生
public class Student implements ILeiFeng {
@Override
public void sweep() {
System.out.println("学生扫地");
}
@Override
public void wash() {
System.out.println("学生洗衣服");
}
@Override
public void buyRice() {
System.out.println("学生买米");
}
}
2.产品二:志愿者
public class Volunteer implements ILeiFeng{
@Override
public void sweep() {
System.out.println("志愿者扫地");
}
@Override
public void wash() {
System.out.println("志愿者洗衣服");
}
@Override
public void buyRice() {
System.out.println("志愿者买米");
}
}
4. 创建工厂类父类接口
public interface IFactory {
/**
* 创建雷锋对象
* @return
*/
ILeiFeng createLeiFeng();
}
5. 创建工厂类子类实现工厂类父类接口
1.学生工厂类实现
public class StudentFactory implements IFactory {
@Override
public ILeiFeng createLeiFeng() {
return new Student();
}
}
2.志愿者工厂类实现
public class VolunteerFactory implements IFactory {
@Override
public ILeiFeng createLeiFeng() {
return new Volunteer();
}
}
6. 测试类
public class Test {
@org.junit.Test
public void test(){
//需要切换 只需要修改这个工厂类
IFactory factory = new VolunteerFactory();
ILeiFeng leiFeng = factory.createLeiFeng();
leiFeng.sweep();
leiFeng.wash();
leiFeng.buyRice();
}
}
7.小结
优:
克服了简单工厂开放-封闭原则,保持了封装对象创建过程的优点,
拥抱变化,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
缺:
需要Creator和相应的子类作为factory method的载体,如果应用模型
确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。