设计模式(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.抽象工厂模式
  围绕一个超级工厂创建其他厂,这个超级工厂可以看作是其他工厂的工厂。

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

下一篇:抽象工厂模式

发布了79 篇原创文章 · 获赞 42 · 访问量 7897

猜你喜欢

转载自blog.csdn.net/qq_43655835/article/details/103999796