工厂方法模式

简单工厂模式

简单工厂模式是类的创建模式,又叫做静态工厂方法模式。简单工厂模式由一个工厂对象决定产出哪种产品的实例。

为什么使用简单工厂模式

原因:解耦。

A对象如果调用B对象,最简单的方法是new一个B出来,不过如果C和B类都实现一个接口/继承一个类,那么系统需要把B类改成C类,程序不得不重写A类代码。如果程序中有100个地方new了B对象,那么要修改100处,耦合度太高。

简单工厂的实例

水果

public interface Fruit {	
	public void grow();
}

苹果

public class Apple implements Fruit{
	public void grow() {
		System.out.println("Apple grow");
	}
}

葡萄

public class Grape implements Fruit{
	public void grow() {
		System.out.println("Grape grow");
	}
}

 园丁,工厂类

public class Gardener {
	public static Fruit getFruit(String fruitName){
		if("apple".equals(fruitName)){
			return new Apple();
		}else if("grape".equals(fruitName)){
			return new Grape();
		}
		return null;
	}
}

main方法

public static void main(String[] args) {
		Fruit apple = Gardener.getFruit("apple");
		apple.grow();
		Fruit grape = Gardener.getFruit("grape");
		grape.grow();
}

 这样写,用户不需要自己去生产产品,只需要拿到自己的东西就好,这样代码的职责更加明确,耦合度降低了。

方法改进

上面的代码虽然进行一定的分离,但是产品数量如果不断增加那么工厂类每次都需要家if else,这样也不好。

public class Gardener {
	public static Fruit getFruit(String fruitPath) throws Exception{
		Class<?> c = Class.forName(fruitPath);
		return (Fruit) c.newInstance();
	}
}

这个地方使用了反射

main

public static void main(String[] args) throws Exception {
	Fruit apple = Gardener.getFruit("algorithm.Apple");
	apple.grow();
	Fruit grape = Gardener.getFruit("algorithm.Grape");
	grape.grow();
}

这里也有一点问题,比如要重构包的路径,那么就需要修改代码。有三种方法推荐:

1.

public interface FruitPath
{
    public final static String apple = "com.xrq.simplefactory.Apple";
    public final static String grape = "com.xrq.simplefactory.Grape";
}

2.

Apple=com.xrq.simplefactory.Apple
Grape=com.xrq.simplefactory.Grape

3.

<apple>com.xrq.simplefactory.Apple</apple>
<grape>com.xrq.simplefactory.Grape</grape>

简单工厂模式或者工厂模式关注点在于创建产品和消费产品分离。

简单工厂模式的应用

jdk中简单工厂模式有很多应用,比较典型的是线程池。我们使用线程池,可以使用ThreadPoolExecutor,根据喜好传入corePoolSize、maximumPoolSize、keepAliveTimem、unit、workQueue、threadFactory、handler这几个参数,new出一个指定的ThreadPoolExecutor出来。

工厂模式的优缺点

优点

1.简单优化了软件体系结构,明确各个模块的职责。

2.实现生产对象和使用对象的分离,解耦。

缺点

1.使用反射效率会低一些。

原文地址:https://www.cnblogs.com/tp123/p/6474542.html