浅析工厂模式之简单工厂模式

        根据一个例子来对比,传统模式与简单工厂模式的区别:

        有这样一个需求,看一个奶茶的项目:

要便于奶茶种类的扩展,要便于维护

1)奶茶的种类很多(比如PearlMilkTea(珍珠奶茶)、HerbalMilkTea(仙草奶茶)等)
2)奶茶的制作有prepare(准备原材料),water, sealTheCup
3)完成奶茶店订购功能。

1使用传统的方式完成:

 1.1.UML类图:如果UML类图不理解,可以观看我写的浅析UML类图与设计模式的七大准则,这篇文章

 根据OrderMilkTea去订购各种需要的奶茶

1.2.下面请看代码:

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;
	}
}

PearlMilkTea类

public class PearlMilkTea extends MilkTea {

	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		System.out.println(" 给珍珠奶茶 准备原材料 ");
	}

}

HerbalMilkTea类

public class HerbalMilkTea extends MilkTea {

	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		System.out.println(" 给香草奶茶 准备原材料 ");
	}

}

OrderMilkTea类

public class OrderMilkTea {

	// 构造器
	public OrderMilkTea() {
		MilkTea MilkTea = null;
		String orderType; // 订购奶茶的类型
		do {
			orderType = getType();
			if (orderType.equals("Pearl")) {
				pizza = new PearlMilkTea();
				pizza.setName(" 珍珠奶茶 ");
    		} else if (orderType.equals("Herbal")) {
    			pizza = new HerbalMilkTea();
				pizza.setName(" 仙草奶茶 ");
			}  else {
				break;
			}
			//输出pizza 制作过程
			MilkTea.prepare();
			MilkTea.water();
			MilkTea.sealTheCup();
		} while (true);
	}
}

MilkTeaStore

//相当于一个客户端,发出订购
public class MilkTeaStore {

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

}

1.3.传统的方式的优缺点
1)优点是比较好理解,简单易操作。
2)缺点是违反了设计模式的ocp 原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
3)比如我们这时要新增加一个的种类MilkTea,我们需要做如下修改,如果我们增加一个MilkTea类,只要是订购MilkTea的代码都需要修改.

4)改进的思路分析
分析:修改代码可以接受,但是如果我们在其它的地方也有创建MilkTea的代码,就意味着,也需要修改,而创建MilkTea的代码,往往有多处。
思路:把创建MilkTea对象封装到一个类中,这样我们有新的MilkTea种类时,只需要修改该类就可,其它有创建到MilkTea对象的代码就不需要修改了.->简单工厂模式

2.简单工厂模式进行完成:

2.1.简单工厂模式简介:

1)简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式

2)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
3)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.


2.2.UML类图:

 2.3.代码实现:

SimpleFactory类

//简单工厂类
public class SimpleFactory {

	
	public MilkTea createmilkTea(String orderType) {

		MilkTea MilkTea = null;

		System.out.println("使用简单工厂模式");
		if (orderType.equals("Pearl")) {
			MilkTea = new PearlMilkTea();
			MilkTea.setName(" 珍珠奶茶 ");
		} else if (orderType.equals("Herbal")) {
			MilkTea = new HerbalMilkTea();
			MilkTea.setName(" 仙草奶茶 ");
		}
		
		return pizza;
	}
	
	//简单工厂模式 也叫 静态工厂模式 
	
	public static MilkTea createmilkTea2(String orderType) {

		MilkTea MilkTea = null;

		System.out.println("使用简单工厂模式2");
		if (orderType.equals("Pearl")) {
			MilkTea = new PearlMilkTea();
			MilkTea.setName(" 珍珠奶茶 ");
		} else if (orderType.equals("Herbal")) {
			MilkTea = new HerbalMilkTea();
			MilkTea.setName(" 仙草奶茶 ");
		}
		return MilkTea;
	}

}

OrderMilkTea类

public class OrderMilkTea {

	//定义一个简单工厂对象
	SimpleFactory simpleFactory;
	MilkTea milkTea = null;
	
	//构造器
	public OrderMilkTea(SimpleFactory simpleFactory) {
		setFactory(simpleFactory);
	}
	
	public void setFactory(SimpleFactory simpleFactory) {
		String orderType = ""; //用户输入的
		
		this.simpleFactory = simpleFactory; //设置简单工厂对象
		
		do {
			orderType = getType(); 
			milkTea = this.simpleFactory.createmilkTea(orderType);
			
			//输出milkTea
			if(milkTea != null) { //订购成功
				milkTea.prepare();
				milkTea.water();
				milkTea.sealTheCup();
			} else {
				System.out.println(" 订购milkTea失败 ");
				break;
			}
		}while(true);
	}
	
	// 写一个方法,可以获取客户希望订购的milkTea种类
	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 "";
		}
	}

}

OrderMilkTea2类

public class OrderMilkTea2 {

	//定义一个简单工厂对象
	SimpleFactory simpleFactory;
	MilkTea milkTea = null;
	
	//构造器
	public OrderMilkTea2(SimpleFactory simpleFactory) {
		setFactory(simpleFactory);
	}
	
	public void setFactory(SimpleFactory simpleFactory) {
		String orderType = ""; //用户输入的
		
		this.simpleFactory = simpleFactory; //设置简单工厂对象
		
		do {
			orderType = getType(); 
			milkTea = this.simpleFactory.createmilkTea(orderType);
			
			//输出milkTea
			if(milkTea != null) { //订购成功
				milkTea.prepare();
				milkTea.water();
				milkTea.sealTheCup();
			} else {
				System.out.println(" 订购milkTea失败 ");
				break;
			}
		}while(true);
	}
	
	// 写一个方法,可以获取客户希望订购的milkTea种类
	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 PizzaStore {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//使用简单工厂模式
	    new OrderPizza(new SimpleFactory());
		System.out.println("~~退出程序~~");
	}

}

3.总结:

        运用简单工厂模式可以解决,处理多个订单的问题,通过工厂类进行创建,增加多个订单只需要更改工厂类即可,尽可能小的修改代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值