工厂模式概述
工厂模式(Factory Pattern)解决的是实例化对象的问题,在某些情况下,需要创建的对象的初始化操作十分复杂,放在构造函数中会影响代码的可读性;亦或是待一次性需要实例化的对象太多,直接实例化的代码会重复执行很多次,影响执行的效率,这时候如果定义一个形同工厂的类专门负责对象的实例化创建,便可以增加代码可读性和复用性。在任何需要生成复杂对象的地方,都可以使用工厂模式。
较为简单的对象实例化没必要使用工厂模式,反而会增加系统的复杂度
工厂模式分为三种:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
简单工厂模式
简单工厂模式,顾名思义是最简单的工厂模式。根据不同的参数,创建不同类型的实例。一般用于在某一大类下不同小类的实例化。工厂有一个方法,专门负责根据传入的参数生成对应的实例。比如一个生产手机的工厂,可以生产安卓和苹果的手机,使用者可以根据需要来使用对象生产相应的手机。
public class SimpleFactory {
public static void main(String[] args) {
// TODO Auto-generated method stub
MobileFactory mf = createProduct("Apple");
mf.display();
}
//工厂实例化方法
public static MobileFactory createProduct(String s) {
if(s.equals("Apple"))
return new Apple();
else
return new Android();
}
}
//抽象工厂类
abstract class MobileFactory {
public abstract void display();
}
//子类1
class Apple extends MobileFactory{
public void display() {
System.out.println("Apple");
}
}
//子类2
class Android extends MobileFactory{
public void display() {
System.out.println("Android");
}
}
简单工厂模式的优点:
对象创建和使用分离,使用者不必知道怎么创建,直接使用。
缺点:
不够灵活,每新增一个产品就要添加相应的工厂类,逻辑变复杂。
工厂方法模式
工厂方法模式即是将创建实例化的操作推给其子类。比如有一个生产手机的抽象方法,工厂方法模式将生成具体产品的任务分发给具体的手机产品工厂,也就是定义一个抽象工厂,其定义了手机的生产接口,但不负责具体的手机,将生产任务交给不同的手机工厂,负责生产手机的工厂来实例化对象。
//生产手机的工厂类
interface MobilePhoneFactory{
Phone createPhone();
}
//手机
interface MobilePhone{
}
class ApplePhone implements Phone {
public ApplePhone() {
System.out.println("Apple");
}
}
class AndroidPhone implements Phone {
public AndroidPhone() {
System.out.println("Android");
}
}
//生产apple手机的工厂
class AppleFactory implements MobilePhoneFactory{
@Override
public Phone createPhone() {
// TODO Auto-generated method stub
return new ApplePhone();
}
}
//生产android手机的工厂
class AndroidFactory implements MobilePhoneFactory{
@Override
public Phone createPhone() {
// TODO Auto-generated method stub
return new AndroidPhone();
}
}
工厂方法模式优点:
克服了简单工厂违背开放-封闭原则的缺点。
增加产品时无需修改原先待代码。
缺点
增加一个产品,相应的也要增加一个子工厂,加大额外开销。
抽象工厂模式
简单工厂模式只能针对一类产品(手机),如果想生产另一类完全不同的产品,则可以使用工厂方法模式。工厂方法模式通过在工厂中添加新产品的接口,并在子类中实现新添加的产品的创建。现在此工厂只能生产苹果手机,使用抽象工厂模式,添加生产电脑的接口,工厂便可以同时生产苹果的电脑。
public class AbstractFactory {
public static void main(String[] args) {
// TODO Auto-generated method stub
SuperFactory sf = new SuperFactory();
sf.createPC("iMac");
}
}
//工厂
interface Factory{
Phone createPhone(String s);
PC createPC(String s);
}
//具体工厂,负责实例化
class SuperFactory implements Factory{
@Override
public Phone createPhone(String s) {
// TODO Auto-generated method stub
return new iPhone();
}
@Override
public PC createPC(String s) {
// TODO Auto-generated method stub
return new iMac();
}
}
//手机
interface Phone{
}
class iPhone implements Phone{
public iPhone() {
System.out.println("iPhone");
}
}
//电脑
interface PC{
}
class iMac implements PC{
public iMac() {
System.out.println("iMac");
}
}
抽象工厂模式优点:
可以创建多个大类对象,管理方便。
让具体的创建实例过程与客户端分离,不会出现在客户代码中。
缺点:
难以扩展。