23种设计模式之工厂方法模式
定义:
定义一个用于创建对象的接口,让子类决定实例化那个类
使用场景:
在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
/**
* Created by jmfstart on 2017/5/12.
* 抽象产品类
*/
public abstract class Product {
//产品类的抽象方法,由具体的产品类去实现
public abstract void method();
}
//具体产品类A
public class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("我是具体的产品A");
}
}
//具体产品类B
public class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("我是具体产品类B");
}
}
public abstract class Factory {
/**
* 抽象工厂方法
* 具体生产什么由子类去实现
* @return
*/
public abstract <T extends Product>T createProduct(Class<T> clz);
}
/**
* Created by jmfstart on 2017/5/12.
* 具体工厂类
*/
public class ConcreteFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) p;
}
}
/**
* Created by jmfstart on 2017/5/12.
* 客户端
*/
public class Client {
public static void main(String[] args){
Factory factory = new ConcreteFactory();
Product p = factory.createProduct(ConcreteProductA.class);
p.method();
}
}
需要哪一个类的对象就传入哪一个类的类型即可。这种方法比较简洁,动态。
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。
将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
工厂方法模式组成:
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!
总结:
总的来说,工厂方法模式是一个很好的设计模式,在文中多次提到,但是缺点也是难以避免的,每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要设计者权衡利弊了。