浅析工厂模式之抽象工厂模式

前言

如果对本篇文章表示看不懂,可以结合浅析工厂模式之工厂方法模式浅析工厂模式之简单工厂模式,这两篇文章。

1抽象工厂模式简介:

1.1抽象工厂模式:

        定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类

1.2抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

1.3从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

1.4 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

2.UML类图

 3.具体代码:

 BJPearMilkTea类

public class BJPearMilkTea extends MilkTea {
 
	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		setName("北京的珍珠奶茶");
		System.out.println(" 北京的珍珠奶茶 准备原材料");
	}
 
}

 BJHerbalMilkTea类

public class BJHerbalMilkTea extends MilkTea {
	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		setName("北京的香草奶茶");
		System.out.println(" 北京的香草奶茶 准备原材料");
	}
}

LDPearMilkTea类

public class  LDPearMilkTea extends MilkTea {
 
	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		setName("伦敦的珍珠奶茶");
		System.out.println(" 伦敦的珍珠奶茶 准备原材料");
	}
}

 LDHerbalMilkTea类

public class LDHerbalMilkTea extends MilkTea {
	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		setName("伦敦的珍珠奶茶");
		System.out.println(" 伦敦的珍珠奶茶 准备原材料");
	}
}

 MilkTea类:

 
public abstract class MilkTea {
	protected String name; //名字
 
	//准备原材料, 不同的奶茶不一样,因此,我们做成抽象方法
	public abstract void prepare();
 
	
	public void water() {
		System.out.println(name + " water;");
	}
 
	public void sealTheCup() {
		System.out.println(name + " sealTheCup;");
	}
 
	public void setName(String name) {
		this.name = name;
	}
}

AbsFactory类

//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
	//让下面的工厂子类来 具体实现
	public MilkTea createMilkTea(String orderType);
}

BJFactory类

//这是工厂子类
public class BJFactory implements AbsFactory {

	@Override
	public MilkTea createMilkTea(String orderType) {
		System.out.println("~使用的是抽象工厂模式~");
		// TODO Auto-generated method stub
		MilkTea MilkTea = null;
		if(orderType.equals("Pear)) {
			MilkTea = new BJPearMilkTea();
		} else if (orderType.equals("Herbal")) {
			MilkTea = new BJHerbalMilkTea();
		}
		return MilkTea;
	}

}

LDFactory类

public class LDFactory implements AbsFactory {

	@Override
	public MilkTea createMilkTea(String orderType) {
		System.out.println("~使用的是抽象工厂模式~");
		MilkTea MilkTea = null;
		if(orderType.equals("Pear")) {
			MilkTea = new  LDPearMilkTea();
		} else if (orderType.equals("Herbal")) {
			MilkTea = new LDHerbalMilkTea();
		}
		return MilkTea;
	}

}

OrderMilkTea类

public class OrderMilkTea {

	AbsFactory factory;

	// 构造器
	public OrderMilkTea(AbsFactory factory) {
		setFactory(factory);
	}

	private void setFactory(AbsFactory factory) {
		MilkTea MilkTea = null;
		String orderType = ""; // 用户输入
		this.factory = factory;
		do {
			orderType = getType();
			// factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
			MilkTea = factory.createPizza(orderType);
			if (MilkTea != null) { // 订购ok
				MilkTea.prepare();
			    MilkTea.water();
			    MilkTea.sealTheCup();
			} else {
				System.out.println("订购失败");
				break;
			}
		} while (true);
	}

	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input MilkTea 种类:");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}
}

MilkTeaStore类

public class MilkTeaStore {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        //new OrderMilkTea(new BJFactory());
		new OrderMilkTea(new LDFactory());
	}

}

4.工厂模式小结

1.1工厂模式的意义

将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

1.2三种工厂模式

(简单工厂模式、工厂方法模式、抽象工厂模式)

1.3设计模式的依赖抽象原则

创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
不要让类继承具体类,而是继承抽象类或者是实现interface(接口)

不要覆盖基类中已经实现的方法。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值