设计模式学习笔记--简单工厂模式

简单工厂主要是为了选择实现的,一个接口Api,在第一种情况下需要选择ApiImplA实现,在第二种情况下需要选择ApiImplB实现,此时我们一般会创建一个工厂类来生产接口Api的实例

类图如下:
设计模式学习笔记--简单工厂模式 
实例代码如下:
package hx.designpattern.simplefactory;

public interface Api {
	void operation();
}

package hx.designpattern.simplefactory;

public class ApiImplA implements Api {

	@Override
	public void operation() {
		System.out.println("ApiImplA");
	}

}

package hx.designpattern.simplefactory;

public class ApiImplB implements Api {

	@Override
	public void operation() {
		System.out.println("ApiImplB");
	}

}


package hx.designpattern.simplefactory;

public class Factory {

	public static Api createApi(int condition) {
		if (condition == 1) {
			return new ApiImplA();
		} else {
			return new ApiImplB();
		}
	}
}


package hx.designpattern.simplefactory;

public class Client {

	public static void main(String[] args) {
		Api api = Factory.createApi(2);
		api.operation();
	}
}
   
   
    
    
    
    
简单工厂模式的主要作用就是选择具体实现,那么如何进行选择?
上面的代码实例是根据客户端传递进来的条件值来选择的,我们还可以通过别的方式来选择,比如:
1、配置文件,在配置文件中配置好到底是在当前的生产环境中选用哪个实现类
2、通过读取运行期内存中某个值来进行判断选择
简单工厂的优点:
•  帮助封装
简单工厂虽然很简单,但是非常友好的帮助我们实现了组件的封装,然后让组件外部能真正面向接口
编程。
•  解耦
通过简单工厂,实现了客户端和具体实现类的解耦。
如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是
通过工厂获取它需要的接口对象。
简单工厂的缺点:
•  可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能
和含义,这会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实
现。
•  不方便扩展子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创
建接口的方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的。
何时使用?
一个接口只有一个实现的时候是没有必要使用的,当发现一个接口多个实现的时候再去重构就好~一开始就使用简单工厂来创建对象可能是没有必要的~
相关模式比较:
•  简单工厂和抽象工厂模式
简单工厂是用来选择实现的,可以选择任意接口的实现,一个简单工厂可以有多个用于选择并创建对
象的方法,多个方法创建的对象可以有关系也可以没有关系。
抽象工厂模式是用来选择产品簇的实现的,也就是说一般抽象工厂里面有多个用于选择并创建对象的
方法,但是这些方法所创建的对象之间通常是有关系的,这些被创建的对象通常是构成一个产品簇所需
要的部件对象。
所以从某种意义上来说,简单工厂和抽象工厂是类似的,如果抽象工厂退化成为只有一个实现,不分
层次,那么就相当于简单工厂了。
•  简单工厂和工厂方法模式
简单工厂和工厂方法模式也是非常类似的。
工厂方法的本质也是用来选择实现的,跟简单工厂的区别在于工厂方法是把选择具体实现的功能延迟
到子类去实现。
如果把工厂方法中选择的实现放到父类直接实现,那就等同于简单工厂。
•  简单工厂和能创建对象实例的模式
简单工厂的本质是选择实现,所以它可以跟其它任何能够具体的创建对象实例的模式配合使用,比
如:单例模式、原型模式、生成器模式等等。

你可能感兴趣的:(设计模式学习笔记--简单工厂模式)