设计模式(3)---工厂模式

在这里插入图片描述

上一篇:单例模式
1.什么是工厂模式?
   工厂模式是我们平时较常使用得一种设计模式,它实现了创建者与调用者分离。在工厂模式中,我们在创建对象得时候不会对客户端暴露创建逻辑,并且是通过使用一个共同得接口来指向新创建得对象。

   太官方了,整不懂?大白话就是:你买一个手机,直接从手机生产商那里提货用就行了,不用去管它手机内部是怎么构建得,功能是怎么实现得。

2.什么时候使用工厂模式?

  工厂模式并不是任何时候都适合使用的,工厂模式在创建复杂的对象的适合更加适合使用,如果是普通对象直接new就完事了。因为使用工厂模式就需要引入一个工厂类,增加了系统的复杂度。

3.工厂模式分类?
1.简单工厂模式
  用来生产同一等级结构中的任意产品 。

在这里插入图片描述

/**
 *简单工厂---Car接口
 */
public interface Car {

	void name();
}
public class BenChi implements Car {

	@Override
	public void name() {
		System.out.println("奔驰车");
	}
}
public class BaoMa implements Car {

	@Override
	public void name() {
		System.out.println("宝马车");
	}
}
/**
 * 普通的方式---测试类
 */
public class Test {

	public static void main(String[] args) {
		Car car=new BenChi();
		Car car1 = new BaoMa();
		car.name();
		car1.name();
	}
}

将上面的测试类使用工厂模式来进行改造:

首先创建一个Car工厂类,用于获取Car。

/**
 * Car工厂类
 */
public class CarFactory {

	//获取Car的方法
	public static Car getCar(String carName) {
		if (carName.equals("benchi")) {
			return new BenChi();
		} else if (carName.equals("baoma")) {
			return new BaoMa();
		} else {
			return null;
		}
	}
}

然后编写测试类:

public class Test01 {

	public static void main(String[] args) {
		Car benchi = CarFactory.getCar("benchi");
		Car baoma = CarFactory.getCar("baoma");

		benchi.name();
		baoma.name();

	}
}

以上代码分别使用了普通new对象的方法获取车工厂模式获取车两种不同的方式。

  但是如果现在我们想要一个大众车,那就需要去CarFactory中修改逻辑代码,这不符合OOP中的开闭原则(对扩展开放,对修改关闭),如果想要符合开闭原则,方便横向扩展,则可以使用工厂方法模式

2.工厂方法模式
  用来生产同一等级结构中的固定产品。

在这里插入图片描述

1)修改CarFactory,注意是interface

/**
 * Car工厂类
 */
public interface CarFactory {

	Car getCar();
}

2)创建一个新的BaoMaFactory

public class BaoMaFactory implements CarFactory {

	@Override
	public Car getCar() {
		return new BaoMa();
	}
}

3)创建一个新的BenChiFactory

public class BenChiFactory implements CarFactory {

	@Override
	public Car getCar() {
		return new BenChi();
	}
}

4)测试类

public class Test02 {

	public static void main(String[] args) {

		Car baoma = new BaoMaFactory().getCar();
		Car benchi  = new BenChiFactory().getCar();
		
		baoma.name();
		benchi.name();
	}
}

  使用此种模式代码量明显比第一种代码量多,但是此种方式方便我们横向扩展,此时如果我们需要的是大众车,直接新创建一个DaZhongFactory就行了,不需要去修改原来的代码,符合开闭原则

  此种方式虽然满足了开闭原则,能够非常简单的实现横向扩展,但是!

  相信大家已经发现此种方式的弊端:如果我要10个车那就需要new 10个对应的车的工厂类。100个就需要100个对应车的工厂类……它让我们的整个项目体系更加复杂化了,所以工厂模式在实际的应用中简单工厂类反而使用的较多。

3.抽象工厂模式
  围绕一个超级工厂创建其他厂,这个超级工厂可以看作是其他工厂的工厂。

  抽象工厂模式虽然也是工厂模式的一种,但是两者本质上还是有区别的。所以在设计模式中,我们也将抽象工厂模式工厂模式分开为两种不同的创建对象的模式。

下一篇:抽象工厂模式
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值