抽象工厂--Java实现

本文介绍了抽象工厂模式的概念,以Beijing和Shanghai餐馆为例,阐述了如何创建相关对象的系列。通过UML图展示了抽象工厂类、具体工厂类和Eat、Drink的实现。并讨论了简单工厂模式与抽象工厂模式的改进,强调了抽象工厂在产品族替换和代码解耦方面的优势,同时提到了其在数据库切换中的应用。
摘要由CSDN通过智能技术生成

抽象工厂:提供一系列相关或互相依赖对象的接口,而无须指定它们具体的类。


抽象工厂


例子:依旧是上篇博客中的例子,Beijing和Shanghai餐馆分别都有Eat和Drink两个方法,而Beijing和Shanghai属于不同的产品足族(它们都有自己的系列),所以此时可以使用抽象工厂模式。UML图如下:


    


抽象工厂类:创建访问对象的工厂接口


/*
 * 抽象工厂类:Eat Drink两个不同方法
 */
public abstract class AbstractFactory {
	public abstract Eat createRestaurantEat();
	public abstract Drink createRestaurantDrink();
}


具体工厂类:Beijing或Shanghai


/*
 * 具体创建对象的工厂
 */
public class RestaurantBeijing extends AbstractFactory {
	@Override
	public Eat createRestaurantEat() {
		return new EatBeijing();
	}
	@Override
	public Drink createRestaurantDrink() {
		return new DrinkBeijing();
	}
}

抽象类Eat:


/*
 * Eat抽象类
 */
public abstract class Eat {
	public abstract void eat();
}

Eat具体实现类:


/*
 * Eat具体实现类
 */
public class EatBeijing extends Eat {
	@Override
	public void eat() {
		System.out.println("在北京餐馆吃饭");
	}
}

public class EatShanghai extends Eat {
	@Override
	public void eat() {
		System.out.println("在上海餐馆吃饭");
	}
}

Demo:创建实例,调用方法


public class demo {
	public static void main(String[] args) {
		//北京分店餐馆
		//多态:创建工厂实现类
		AbstractFactory abstractFactory=new RestaurantBeijing();
		//多态:具体工厂实现类创建eat的具体实现
		Eat createRestaurantEat = abstractFactory.createRestaurantEat();
		//调用方法
		createRestaurantEat.eat();
		Drink createRestaurantDrink = abstractFactory.createRestaurantDrink();
		createRestaurantDrink.drink();
	}
}

控制台显示:


   

由此我们可以看到当出现不同的产品族、整体不同的系列时,抽象工厂就非常实用。


简单工厂改进抽象工厂


当我们需要在原有基础上增加新的功能如:唱歌时,需要修改的三个抽象类,这样就很复杂,所以可以使用简单工厂+抽象工厂进行改进。


    


抽象类Eat/Drink


/*
 * 抽象类
 */
public abstract class Eat {
	public abstract void eat();
}

抽象的具体实现类


/*
 * 抽象的具体实现类
 */
public class EatBeijing extends Eat {
	@Override
	public void eat() {
		System.out.println("在北京餐馆吃饭");
	}
}

public class EatShanghai extends Eat {
	@Override
	public void eat() {
		System.out.println("在上海餐馆吃饭");
	}
}

抽象工厂+简单工厂:动态实例化对象


/*
 * 抽象工厂+简单工厂
 */
public class SumFactory {
	//可以从前台传参过来
	private static String place="上海";
	
	//吃
	public static Eat createEat(){
		Eat eat=null;
		switch(place){
		case "北京":
			eat=new EatBeijing();
			break;
		case "上海":
			eat=new EatShanghai();
			break;
		}
		return eat;
	}
	
	//喝
	public static Drink createDrink(){
		Drink drink=null;
		switch(place){
		case "北京":
			drink=new DrinkBeijing();
			break;
		case "上海":
			drink=new DrinkShanghai();
			break;
		}
		return drink;
	}
}

Demo:创建实例,调用方法


public class demo {
	public static void main(String[] args) {
		//分店餐馆
		Eat eat=SumFactory.createEat();
		eat.eat();
		Drink drink=SumFactory.createDrink();
		drink.drink();
	}
}

控制台显示


   

抽象工厂的优点是便于交换产品系列,让具体的创建实例过程与客户端分离,客户端是通过抽象接口操作实例,产品的具体类别也被具体工厂分离,遵循了开放-封闭和依赖倒转原则。


抽象工厂也可以应用于数据库的切换中,应用反射技术,动态获得类和对象,与配置文件的结合更加灵活应用。


抽象工厂的学习还在路上,走走停停,不断前进。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值