第四章、Java设计模式-工厂方法模式(Factory Method)

 一、简介

 1.定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。

2.结构图



 Product:工厂方法所创建对象的接口,即实际使用对象的接口

ConcreteProduct:具体的Product接口的实现对象

Creator:申明工厂方法

ConcreteCreator:具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例

 

二、Java实现

1.实例

 

public interface AudiProducer {
	public boolean produce();
}
public class A3AudiProducer implements AudiProducer {
	@Override
	public boolean produce() {
		System.out.println("Produce a car of 'Audi A3'");
		return true;
	}
}
public class Q5AudiProducer implements AudiProducer {
	@Override
	public boolean produce() {
		System.out.println("Produce a car of 'Audi Q5'");
		return true;
	}
}

 

public abstract class AudiCreator {
	protected abstract AudiProducer create();

	public void produce() {
		AudiProducer producer = create();
		producer.produce();
	}
}
public class A3AudiCreator extends AudiCreator {
	@Override
	protected AudiProducer create() {
		return new A3AudiProducer();
	}
}

  

public class FactoryMethodTest {
	public static void main(String[] args) {
		AudiCreator audiCreator = new A3AudiCreator();
		audiCreator.produce();
	}
}

 

2.要点

  • 抽象类AudiCreator并不知道create()方法的具体实现,只关心&完成自身功能的调用
  • AudiCreator.create()具体的实现延迟到子类完成
  • 工厂方法一般不提供给外部(本例中指AudiCreator以外)的类调用
    protected AudiProducer create(String type) {
    	if ("A4".equals(type)) {
    		return new A4AudiProducer();
    	} else {
    		return super.create();
    	}
    }
     
  • 客户端(如FactoryMethodTest)应该使用AudiCreator或其创建出来的对象,一般不直接使用工厂方法

3.参数化工厂

工厂方法接受一个参数,根据参数判断生成什么对象,而子类重写时可以只处理自己关心的参数类型,而其他情况交给父类处理

改造后的工厂方法

public class AudiCreator {
	protected AudiProducer create(String type) {
		if ("A3".equals(type)) {
			return new A3AudiProducer();
		} else if ("Q5".equals(type)) {
			return new Q5AudiProducer();
		} else {
			return null;
		}
	}

	public void produce() {
		AudiProducer producer = create("A3");
		producer.produce();
	}
}

 如果我们又有一个新的A3AudiProducer需要创建,我们可以继承AudiCreator并重写方法create,提供A3AudiProducer的创建支持

protected AudiProducer create(String type) {
	if ("A4".equals(type)) {
		return new A4AudiProducer();
	} else {
		return null;
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值