工厂方法模式

概念:定义一个创建产品对象的工厂接口,实际创建工作交给子类完成。核心工厂类成为抽象工厂角色,仅负责具体工厂子类必须实现的接口。这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改已存在的具体工厂角色的情况下,引进新的产品工厂类。

 

工厂方法模式(多态工厂模式)在设计模式定位:类的创建型模式 / 对象实例化的模式,创建型模式用于解耦对象的实例化过程。

 

干什么:创建实例对象

 

作用:解耦,类与类之间的依赖关系通过工厂类为媒介;改善简单工厂模式扩展性不佳的问题,在不修改已存在的具体工厂角色的情况下引进新的产品工厂类。

 

该模式的核心知识点:

1.抽象工厂角色(核心)

工厂方法模式的核心,任何工厂类必须实现这个接口。

 2.具体工厂角色

具体工厂类是抽象工厂类的一个实现,负责实例化产品对象

 3. 抽象角色

工厂方法模式所创建的所有实例对象的父类,它负责描述所有实例对象所共有的公共接口。

一个抽象角色对应一个具体工厂角色

4.具体产品角色

工厂方法模式所创建的具体实例对象。

代码实例:

//抽象角色是子类工厂所创建实例对象的父类
public interface Fruit {
	/*
	 * 采集
	 */
	public void get();
}

//具体角色
public class Apple implements Fruit{
	/*
	 * 采集
	 */
	public void get(){
		System.out.println("采集苹果");
	}
}

public class Banana implements Fruit{
	/*
	 * 采集
	 */
	public void get(){
		System.out.println("采集香蕉");
	}
}

//抽象工厂(核心工厂)。抽象工厂向外提供功能,具体实例对象的创建工作交给子类完成。好处是新增加
的具体产品工厂类,不需要修改已存在的具体产品工厂类。
public interface FruitFactory {
	public Fruit getFruit();
}

//具体工厂
public class AppleFactory implements FruitFactory {

	public Fruit getFruit() {
		return new Apple();
	}

}

public class BananaFactory implements FruitFactory {

	public Fruit getFruit() {
		return new Banana();
	}

}

//客户端
public class MainClass {
	public static void main(String[] args) {
		//工厂方法模式又叫多态方法模式,从工厂方法的使用可以看出,子类的实现指向父类的引用。

        //获得AppleFactory
		FruitFactory ff = new AppleFactory();
		//通过AppleFactory来获得Apple实例对象
		Fruit apple = ff.getFruit();
		apple.get();
		
		//获得BananaFactory
		FruitFactory ff2 = new BananaFactory();
		Fruit banana = ff2.getFruit();
		banana.get();
		
		//获得PearFactory
		FruitFactory ff3 = new PearFactory();
		Fruit pear = ff3.getFruit();
		pear.get();
	}
}

具体工厂类中的逻辑,可以使用if..else..,也可以使用反射的方式实现。

 

工厂方式模式和简单工厂模式比较

结构:工厂方法模式的核心是一个抽象工厂,而简单工厂模式把核心放在一个具体的类上。

名称上的区别:工厂方法模式的别名叫多态工厂模式,是因为具体工厂都有共同的接口,或者抽象父类;简单工厂模式的别名静态工厂模式,是因为创建实例是类调用它的静态方法获取的。【static方法指的是该方法被该类的所有对象所共有,与内部的执行无关。如果静态方法内部有new 方法创建对象,每次调用static方法时,内部的new方法都会创建一个新的对象】

优点:系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要做任何修改,也不需要修改客户端。很好的符合 “开放 - 封闭”原则【开放是对扩张开放,封闭是对修改封闭】。

工厂方法模式退化后可以演变成简单工厂模式。

 

知识外扩:静态方法

在Java中必须实例化对象才能调用非静态方法。

静态方法与非静态方法的区别是生命周期。

静态方法的生命周期从进程被创建就开始,直到进程结束。所以说静态方法是全局的,贯穿整个进程。

非静态放的生命周期从类实例化对象开始,直到实例对象被注销回收之后结束。

由此可知,静态方法的生命周期比非静态方法的生命周期长。因此,静态方法不能调用非静态方法【非静态方法的调用需要实例化对象,这时没有实例化对象,所以在静态方法中无法调用非静态方法】,非静态方法可以调用静态方法。

优点:

缺点:

注意:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值