Java中的工厂模式:
(1) 核心思想:工厂模式相当于创建实例对象new(效果一致),但是工厂模式具有更大的可扩展性和少的修改量(类中写别的类,好调用);更好的封装,降低程序之间的耦合程度。
(2) 关注焦点:无论什么工厂模式,不用刻意关注其细节,只要能够解决需求即可,只关心程序的耦合度下降了就可以。
造车为例:
(3) 简单工厂模式(静态工厂模式):将造车行为放入到工厂里,客户想要产品,就直接调用工厂的造车方法即可;
(只有一个工厂,完成所有车的生产,若要增加,就要修改工厂)
即:(包含工厂类、抽象产品、具体产品)
eg:
/**
* 客户想要车
*/
public class simpleFactory {
public static void main(String[] args) {
//工厂生产
factory factory = new factory();
//开始造车,(大、中、小)
factory.produceVihecle("big");
factory.produceVihecle("middle");
factory.produceVihecle("small");
}
}
/**
* 工厂生产车辆:只有一个工厂
*/
class factory{
//按规模造车(大、中、小)
public vihecle produceVihecle(String scale) {
switch (scale) {
case "big":
return new bigVihecle();
case "middle":
return new middleVihecle();
case "small":
return new smallVihecle();
default:
break;
}
return null;
}
}
/**
* 产品:抽象产品,具体产品
*/
//抽象产品
abstract class vihecle{
public vihecle() {
}
}
//具体产品:大车
class bigVihecle extends vihecle{
public bigVihecle() {
System.out.println("大车生产成功");
}
}
//具体产品:中车
class middleVihecle extends vihecle{
public middleVihecle() {
System.out.println("中车生产成功");
}
}
//具体产品:小车
class smallVihecle extends vihecle{
public smallVihecle() {
System.out.println("小车生产成功");
}
}
(4) 工厂方法模式:对于造车(更多的型号、颜色或规模,简单工厂模式成本太大,)
(一个抽象工厂,多个具体工厂,分别负责相应功能车辆的生产)
即:(包含抽象工厂类、具体工厂类、抽象产品、具体产品)
eg:
/**
* 客户想要车
*/
public class factoryMethod {
public static void main(String[] args) {
//想要大车,大车工厂生产
bigFactory bigFactory = new bigFactory();
bigFactory.produceVehicle();
//想要中车,中车工厂生产
middleFactory middleFactory = new middleFactory();
middleFactory.produceVehicle();
//想要小车,小车工厂生产
smallFactory smallFactory = new smallFactory();
smallFactory.produceVehicle();
}
}
/**
* 工厂生产车辆:抽象工厂接口,具体工厂生产
*/
//抽象工厂
interface factory{
vehicle produceVehicle();
}
//具体工厂:生产大车
class bigFactory implements factory{
public vehicle produceVehicle() {
return new bigVehicle();
}
}
//具体工厂:生产中车
class middleFactory implements factory{
public vehicle produceVehicle() {
return new middleVehicle();
}
}
//具体工厂:生产小车
class smallFactory implements factory{
public vehicle produceVehicle() {
return new smallVehicle();
}
}
/**
* 产品:抽象产品,具体产品
*/
//抽象产品
abstract class vehicle{
public vehicle() {
}
}
//具体产品:大车
class bigVehicle extends vehicle{
public bigVehicle() {
System.out.println("大车生产成功");
}
}
//具体产品:中车
class middleVehicle extends vehicle{
public middleVehicle() {
System.out.println("中车生产成功");
}
}
//具体产品:小车
class smallVehicle extends vehicle{
public smallVehicle() {
System.out.println("小车生产成功");
}
}
(5) 抽象工厂模式:(创建一组相关的或依赖的对象),大车、中车、小车均需创造导航、空调,并可以互相使用?
(一个抽象工厂(其中有很多方法,生产导航等),多个具体工厂(既生产大小中车,也生产轮胎等,并且大小中车都可以互相的导航和空调))
eg:
/**
* 客户想要车
*/
public class factoryAbstract {
public static void main(String[] args) {
//想要大车,中车的导航和小车的空调
bigFactory bigFactory = new bigFactory();
middleFactory middleFactory = new middleFactory();
smallFactory smallFactory = new smallFactory();
bigFactory.produceVehicle();
middleFactory.produceNavigation();
smallFactory.produceAirCondition();
}
}
/**
* 工厂生产车辆、导航和空调:抽象工厂接口,具体工厂生产
*/
interface factory{
//车辆生产
vehicle produceVehicle();
//导航生产
navigation produceNavigation();
//空调生产
ariCondition produceAirCondition();
}
//具体工厂
class bigFactory implements factory{
public vehicle produceVehicle() {
return new bigVehicle();
}
public navigation produceNavigation() {
return new bigNavigation();
}
public ariCondition produceAirCondition() {
return new bigAriCondition();
}
}
class middleFactory implements factory{
public vehicle produceVehicle() {
return new middleVehicle();
}
public navigation produceNavigation() {
return new middleNavigation();
}
public ariCondition produceAirCondition() {
return new middleAriCondition();
}
}
class smallFactory implements factory{
public vehicle produceVehicle() {
return new smallVehicle();
}
public navigation produceNavigation() {
return new smallNavigation();
}
public ariCondition produceAirCondition() {
return new smallAriCondition();
}
}
/**
* 产品(车辆、导航和空调):抽象产品,具体产品
*/
//车辆
abstract class vehicle{
}
class bigVehicle extends vehicle{
public bigVehicle() {
System.out.println("大车生产成功");
}
}
class middleVehicle extends vehicle{
public middleVehicle() {
System.out.println("中车生产成功");
}
}
class smallVehicle extends vehicle{
public smallVehicle() {
System.out.println("小车生产成功");
}
}
//导航
abstract class navigation{
}
class bigNavigation extends navigation{
public bigNavigation() {
System.out.println("大车导航生产成功");
}
}
class middleNavigation extends navigation{
public middleNavigation() {
System.out.println("中车导航生产成功");
}
}
class smallNavigation extends navigation{
public smallNavigation() {
System.out.println("小车导航生产成功");
}
}
//空调
abstract class ariCondition{
}
class bigAriCondition extends ariCondition{
public bigAriCondition() {
System.out.println("大车空调生产成功");
}
}
class middleAriCondition extends ariCondition{
public middleAriCondition() {
System.out.println("中车空调生产成功");
}
}
class smallAriCondition extends ariCondition{
public smallAriCondition() {
System.out.println("小车空调生产成功");
}
}