java设计模式-简单工厂模式

  • 格式:pdf
  • 大小:135.74 KB
  • 文档页数:4

java设计模式-简单⼯⼚模式简单⼯⼚模式详解

⼀,概述

简单⼯⼚模式属于创建型模式⼜叫做静态⼯⼚⽅法模式,它属于类创建型模式。在简单⼯⼚模式中,可以根据参数的不同返回不同类的

实例。

简单⼯⼚模式专门定义⼀个类来负责创建其他类的实例,被创建的实例通常都具有共同的⽗类。

简单⼯⼚只需要传⼊⼀个正确的参数,就可以获取所需要的对象,⽽⽆需知道其实现过程。

简单⼯⼚模式中⽤于被创建实例的⽅法通常为因此简单⼯⼚模式⼜被成为静态⼯⼚⽅法(Static Factory Method)。

下⾯由我深⼊浅出的给⼤家讲解下简单⼯⼚模式,不⾜之处还望批评指正。

⼆,结构图

Factory:⼯⼚类,简单⼯⼚模式的核⼼,它负责实现创建所有实例的内部逻辑。⼯⼚类的创建产品类的⽅法可以被外界直接调⽤,创建所需的产品对象。

IProduct:抽象产品类,简单⼯⼚模式所创建的所有对象的⽗类,它负责描述所有实例所共有的公共接⼝。

Product:具体产品类,是简单⼯⼚模式的创建⽬标

三,简单⼯⼚举例说明 

这⾥我们以⾷品加⼯⼚来举例,假设有⼀个⾷品加⼯⼚,主要加⼯啤酒饮料矿泉⽔,根据需求,我们就需要⽤⼀个单独的类来专门⽣

产啤酒饮料矿泉⽔,这就⽤到了简单⼯⼚模式,下⾯我们来实现简单⼯⼚模式。

四,具体代码实现

第⼀步:我们⾸先创建我们的⾷品基类,也就是⾷品⽗类,也就是我们结构图中抽象产品类,这是个抽象类。

package pattern.simplenessfactory;

/**

*产品抽象类

* @author ningbeibei

*

*/

public abstract class Product {

//获取产品⽅法

public abstract void getFood();

}

第⼆步:具体的啤酒饮料矿泉⽔⾷品类都需要继承⾷品抽象类 Product

package pattern.simplenessfactory;

/**

* 具体啤酒类继承⾃Product类

* @author ningbeibei

*

*/

public class Berr extends Product {

@Override

public void getFood() {

System.out.println("啤酒");

};

}

package pattern.simplenessfactory;

/**

* 具体饮料类继承⾃Product

* @author ningbeibei

*

*/

public class Drinks extends Product {

@Override

public void getFood() { System.out.println("饮料");

}

}

package pattern.simplenessfactory;

/**

* 具体矿泉⽔类继承⾃Product

* @author ningbeibei

*

*/

public class Water extends Product {

@Override

public void getFood() {

System.out.println("矿泉⽔");

}

}

第三步:上⾯我们已经把产品类设计好了,现在开始创建⾷品加⼯⼚Factory

⾷品加⼯⼯⼚专门负责创建具体的⾷品对象并返回,⼤家看下⾯getCommodity(String type) ⽅法,这个⽅法是静态⽅法,并且根据参数

决定创建⾷品对象,⽅法内部通过逻辑判断决定返回啤酒还是饮料或者是矿泉⽔,要注意的是:Product product = null; 这个变量⽤到的是

java的特性继承和多态,简单说:⼦类对象⽗类型。

package pattern.simplenessfactory;

/**

* ⾷品加⼯⼯⼚

* 根据需要专门负责⽣产各中⾷品,也就是专门创建各种所需对象

* @author ningbeibei

*/

public class Factory {

//根据传⼊参数返某个⾷品,也就是⾷品对象

public static Product getCommodity(String type) {

//这个变量是抽象类,也就是⾷品类的⽗类

Product product = null;

switch (type) {

case "啤酒":

product = new Berr();

break;

case "饮料":

product = new Drinks();

break;

case "矿泉⽔":

product = new Water();

break;

}

return product;

}

}

第四步:编写测试类

package pattern.simplenessfactory;

/**

* 简单⼯⼚模式测试类

* @author ningbeibei

*/

public class test {

public static void main(String[] args) {

//通过⼯⼚Factory类中的getCommodity()⽅法获取啤酒对象

Factory.getCommodity("啤酒").getFood();

//通过⼯⼚Factory类中的getCommodity()⽅法获取饮料对象

Factory.getCommodity("饮料").getFood();

//通过⼯⼚Factory类中的getCommodity()⽅法获取矿泉⽔对象

Factory.getCommodity("矿泉⽔").getFood();

}

}

五,思考题

现在我们来思考⼀个问题,如果我这个⼯⼚随着规模扩⼤业务提升,我现在不但要卖啤酒饮料矿泉⽔,我还要卖花⽣⽜奶⼋宝粥,请问

在现有简单⼯⼚模式下怎么扩展新产品?

六,思考题解答 如果简单⼯⼚要扩展新产品那么需要以下⼏步:

(1),新增产品类并继承Product类

package pattern.simplenessfactory;

/**

* 新增产品花⽣,继承⾃Product类

* @author ningbeibei

*

*/

public class Peanut extends Product {

@Override

public void getFood() {

System.out.println("新增产品花⽣");

}

}

(2),修改⾷品⼯⼚Factory类中的逻辑判断,添加新增产品花⽣逻辑判断

package pattern.simplenessfactory;

/**

* ⾷品加⼯⼯⼚

* 根据需要专门负责⽣产各中⾷品,也就是专门创建各种所需对象

* @author ningbeibei

*/

public class Factory {

//根据传⼊参数返某个⾷品,也就是⾷品对象

public static Product getCommodity(String type) {

//这个变量是抽象类,也就是⾷品类的⽗类

Product product = null;

switch (type) {

case "啤酒":

product = new Berr();

break;

case "饮料":

product = new Drinks();

break;

case "矿泉⽔":

product = new Water();

break;

case "花⽣":

product = new Peanut();

break;

}

return product;

}

}

现在我们发现我们竟然修改了⾷品⼯⼚逻辑代码,这对于⼀个⼤型项⽬来说,是有风险的,并且违背了设计模式开闭原则:简单说明开

闭原则,就是对扩展开放对修改封闭。

测试类

package pattern.simplenessfactory;

/**

* 简单⼯⼚模式测试类

* @author ningbeibei

*/

public class test {

public static void main(String[] args) {

//通过⼯⼚Factory类中的getCommodity()⽅法获取啤酒对象

Factory.getCommodity("啤酒").getFood();

//通过⼯⼚Factory类中的getCommodity()⽅法获取饮料对象

Factory.getCommodity("饮料").getFood();

//通过⼯⼚Factory类中的getCommodity()⽅法获取矿泉⽔对象

Factory.getCommodity("矿泉⽔").getFood();

//新增花⽣产品,通过⼯⼚Factory类中的getCommodity()⽅法获取花⽣对象

Factory.getCommodity("花⽣").getFood();

}

}

运⾏结果

七,现在我们总结下简单⼯⼚模式的优缺店