欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

工厂模式一一简单工厂(factory)

程序员文章站 2022-06-15 14:15:24
...

写在前面    

      首先要明白简单工厂,并不是23种设计模式的一种,它更应该归类到一种编程习惯之中,不论是抽象工厂,还是工厂方法都是比较成熟而且富有弹性的设计模式了,在这里谈简单工厂是为了引出那两个重磅级的设计模式。

 

简单工厂的作用

      工厂,一听就知道是用来制造东西的,而在程序里工厂是专门用来创建对象的,这点都不例外,说白了简单工厂模式,就是专门建立了一个类负责对象的创建,想要对象就去找工厂要就行了。

 

下面举个实例分析一下用不用工厂模式的区别

我们现在有个菜单(接口),有三个实现接口的类,分别是面条,米饭和饺子,模拟一位顾客去吃饭。

 

 类图如下

        工厂模式一一简单工厂(factory)

   

Java源程序如下

         

菜单类   

package simplefactory_06;

public interface Menu {
	public void getMeal();
}

 

面条类

package simplefactory_06;

public class Noodles implements Menu{

	public void getMeal() {
		System.out.println("面条");
	}

}

 

饺子类

package simplefactory_06;

public class Dumpling implements Menu{

	public void getMeal() {
		System.out.println("饺子");
	}

}

 

米饭类

package simplefactory_06;

public class Rice implements Menu{

	public void getMeal() {
		System.out.println("大米");
	}

}

 

客户端

package simplefactory_06;

public class Client {
	public static void main(String[] args) {
        	Menu m=new Noodles();
		m.getMeal();
		Menu m1=new Rice();
		m1.getMeal();
	}
}

 

下面引入简单工厂

 

类图

      工厂模式一一简单工厂(factory)

   

java源程序添加工厂类

package simplefactory_06;

public class FoodFactory {
	static Menu menu;
	public static Menu getFood(String food){//声明静态方法,用于创建所需对象并返回
		if(food.equals("rice"))
			menu=new Rice();
		else if(food.equals("noodles"))
			menu=new Noodles();
		else
			menu=new Dumpling();
		return menu;
	}
}

   

把客户端改为

package simplefactory_06;

public class Client {
	public static void main(String[] args) {
		Menu m=FoodFactory.getFood("");
		m.getMeal();
	}
}

 

对比分析

      引入简单工厂之后,客户端想要吃什么,就直接找工厂要对象,而不是自己创建对象,实质上也就是对创建对象进行了封装,其实我之前举外观模式的例子,类图和程序都跟这个例子很像,但是要区别也很容易,外观模式包装接口是为了简化接口,简单工厂是为了统一创建对象。

 

这样设计的优点

    1. 实现了客户端代码与具体实现的解耦
    2. 使用对象的时候直接获取,而不必了解对象是怎么创建和管理的
    3. 使职责分工更加明确,便于系统优化

 

缺点

    1. 由于工厂类集中了所有实例的创建逻辑,违反了高内聚低耦合的原则。
    2. 如果要添加新的饭就必须对工厂类进行修改,违反了开闭原则。

 

而创建简单工厂需要有几种角色

工厂类

包含了创建具体类的静态方法(FoodFactory)

抽象产品

简单工厂要返回的产品(menu)

具体产品

具体产品(rice noodles )

 

课后想一想

      如果我们的菜单要加入蛋炒饭类,需要更改哪些地方,会不会更改原有的类程序。

       下篇文章,我会把简单工厂稍作改进,使它变得容易扩展,这也就是大名鼎鼎的工厂方法模式

          传送门  :  https://blog.csdn.net/zhen921/article/details/82021274