工厂模式

工厂模式

工厂模式(Factory Pattern)

属于创建型模式中的一种常用的软件设计模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

常见的应用

  • JDBC中Connection对象的获取
  • spring框架中IOC容器创建管理bean对象
  • 反射中Class对象的newInstance()
  • mybatis框架中的SessionFactory创建session
  • Calendar类的getInstance()
  • LoggerFactory 获取 Logger 对象

优点

实现了创建者和调用者的分离,实例化对象用工厂方法代替new操作,将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦,增强系统的扩展性。相比于普通的直接实例化,工厂模式更符合面向对象设计的六大基本原则。

工厂模式的三种方式

  • 简单工厂模式(又名静态工厂模式
  • 工厂方法模式
  • 抽象工厂模式

简单工厂模式

简单工厂模式也叫静态工厂模式,将对象的创建交给专门的工厂负责,工厂类一般使用静态方法,通过接收参数的不同来返回不同的对象实例。虽然在某种程度上不符合设计原则,但是在实际中使用最多。

接口Car

public interface Car {	
    void run();
}

实现类Audi

public class Audi implements Car{

    @Override
    public void run() {
	System.out.println("奥迪启动了!!!");		
    }
}

实现类Benz

public class Benz implements Car{

    @Override
    public void run() {
	System.out.println("奔驰启动了!!!");		
    }
}

简单工厂类CarFactory

public class CarFactory {

    public static Car createCar(String type) {
	if ("奥迪".equals(type)) {
		return new Audi();
	}else if ("奔驰".equals(type)) {
		return new Benz();
	}else {
		return null;
	}
    }
}

另一种方式静态工厂模式CarFactory2

public class CarFactory2 {
	
    public static Car createAudi() {
	return new Audi();
    }

    public static Car createBenz() {
	return new Benz();
    }
}

在没有使用工厂模式下创建对象

public class Client01 {
  
    public static void main(String[] args) {
	Car c1 = new Benz();
	Car c2 = new Audi();
	
	c1.run();
	c2.run();	
    }
}

使用工厂模式创建对象

public class Client02 {
    public static void main(String[] args) {
   
	//简单工厂模式
	Car c1 = CarFactory.createCar("奥迪");
	Car c2 = CarFactory.createCar("奔驰");
	
	//静态工厂模式
	Car c3 = CarFactory2.createAudi();
	Car c4 = CarFactory2.createBenz();
	
	c1.run();
	c2.run();	
	c3.run();	
	c4.run();	
    }
}

工厂方法模式

在不修改已有类的情况下,通过增加新的工厂类来实现扩展。

接口CarFactory

public interface CarFactory {
    Car createCar();
}

奥迪工厂实现类AudiFactory

public class AudiFactory implements CarFactory{

    @Override
    public Car createCar() {		
	return new Audi();
    }
}

奔驰工厂实现类BenzFactory

public class BenzFactory implements CarFactory{

    @Override
    public Car createCar() {
	return new Benz(); 
    }
}

使用工厂方法模式创建对象

public class Client {
    public static void main(String[] args) {
	Car c1 = new AudiFactory().createCar();
	Car c2 = new BenzFactory().createCar();
	
	c1.run();
	c2.run();
    }
}

抽象工厂模式

定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

与工厂方法模式不同的是,工厂方法模式中的工厂只生产单一的产品,而抽象工厂模式中的派生类工厂生产多个产品

抽象工厂接口AbstractCarFactory

public interface AbstractCarFactory {
    Engine createEngine();
    Glass createGlass();
    Seat createSeat();
}

豪华汽车工厂LuxuryCarFactory

public class LuxuryCarFactory implements AbstractCarFactory{

    @Override
    public Engine createEngine() {
	return new LuxuryEngine();
    }

    @Override
    public Glass createGlass() {
	return new LuxuryGlass();
    }

    @Override
    public Seat createSeat() {
	return new LuxurySeat();
    }
}

低端汽车工厂LowCarFactory

public class LowCarFactory implements AbstractCarFactory {

    @Override
    public Engine createEngine() {
	return new LowEngine();
    }

    @Override
    public Glass createGlass() {
	return new LowGlass();
    }

    @Override
    public Seat createSeat() {
	return new LowSeat();
    }
}

接口座椅Seat以及实现类豪华座椅LuxurySeat、低端座椅LowSeat

public interface Seat {
    void soft();
}

class LuxurySeat implements Seat{

    @Override
    public void soft() {
	System.out.println("非常柔软舒适");
    }
}

class LowSeat implements Seat{

    @Override
    public void soft() {
	System.out.println("一般柔软舒适");
    }
}

接口玻璃Seat以及实现类豪华玻璃LuxuryGlass、低端玻璃LowGlass

public interface Glass {
    void stiffness();
}

class LuxuryGlass implements Glass{

    @Override
    public void stiffness() {
	System.out.println("钢化玻璃");
    }	
}

class LowGlass implements Glass{

    @Override
    public void stiffness() {
	System.out.println("普通玻璃");
    }	
}

接口发动机Engine以及实现类豪华发动机LuxuryEngine、低端发动机LowEngine

public interface Engine {
    void run();
}

class LuxuryEngine implements Engine{

    @Override
    public void run() {
	System.out.println("启动快");
    }	
}

class LowEngine implements Engine{

    @Override
    public void run() {
	System.out.println("启动慢");
    }
}

使用抽象工厂模式创建对象

public class Client {
    public static void main(String[] args) {
        //豪华
	CarFactory factory = new LuxuryCarFactory();
	Engine engine = factory.createEngine();
	Glass glass = factory.createGlass();
	Seat seat = factory.createSeat();
	engine.run();
	glass.stiffness();
	seat.soft();
   
	System.out.println("--------------");
	//低端
	CarFactory factory2 = new LowCarFactory();
	Engine engine2 = factory2.createEngine();
	Glass glass2 = factory2.createGlass();
	Seat seat2 = factory2.createSeat();
	engine2.run();
	glass2.stiffness();
	seat2.soft();
    }
}

三种工厂模式对比分析

  • 结构复杂度:简单工厂模式 > 工厂方法模式

  • 代码复杂度:工厂方法模式 > 简单工厂模式

  • 管理复杂度:简单工厂模式 > 工厂方法模式

  • 客户端编程复杂度:简单工厂模式 > 工厂方法模式

  • 设计原则符合程度:工厂方法模式 > 简单工厂模式

    抽象工厂模式与前两种模式不同,前两种模式只针对一类产品,而抽象工厂模式针对的是一个产品族。抽象工厂模式通过在AbstarctFactory中增加创建产品的接口方法,并在具体子工厂中实现新加产品的创建。

如何选用

以上三种工厂模式都有自己的应用场景,根据实际情况来使用,也不必完全的遵守面向对象设计原则,可适当变通。一般来说在针对一类产品情况下,简单工厂模式优于工厂方法模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值