JAVA规划形式之工厂形式(三种工厂形式)

JAVA规划形式之工厂形式—Factory Pattern


1.工厂形式简介

工厂形式用于目标的创立,使得客户从详细的产品目标中被解耦。

2.工厂形式分类

这儿以制作coffee的比如开端工厂形式规划之旅。

咱们知道coffee仅仅一种泛举,在点购咖啡时需求指定详细的咖啡品种:美式咖啡、卡布奇诺、拿铁等等。

JAVA规划形式之工厂形式(三种工厂形式)

/**

拿铁、美式咖啡、卡布奇诺等均为咖啡宗族的一种产品咖啡则作为一种笼统概念@author Lsj
*

*/
public abstract class Coffee {

/**
* 获取coffee称号
* @return
*/
public abstract String getName();

}

/**

美式咖啡@author Lsj
*

*/
public class Americano extends Coffee {

@Override
public String getName() {
return "美式咖啡";
}

}

/**

卡布奇诺@author Lsj
*

*/
public class Cappuccino extends Coffee {

@Override
public String getName() {
return "卡布奇诺";
}

}

/**

拿铁@author Lsj
*

*/
public class Latte extends Coffee {

@Override
public String getName() {
return "拿铁";
}

}

JAVA规划形式之工厂形式(三种工厂形式)

2.1 简略工厂

简略工厂实践不能算作一种规划形式,它引入了创立者的概念,将实例化的代码从运用代码中抽离,在创立者类的静态办法中只处理创立目标的细节,后续创立的实例如需改动,只需改造创立者类即可,

但由于运用静态办法来获取目标,使其不能在运行期间经过不同办法去动态改动创立行为,因而存在必定局限性。

JAVA规划形式之工厂形式(三种工厂形式)

/**

简略工厂--用于创立不同类型的咖啡实例@author Lsj
*

*/
public class SimpleFactory {


/**
* 经过类型获取Coffee实例目标
* @param type 咖啡类型
* @return
*/
public static Coffee createInstance(String type){
if("americano".equals(type)){
return new Americano();
}else if("cappuccino".equals(type)){
return new Cappuccino();
}else if("latte".equals(type)){
return new Latte();
}else{
throw new RuntimeException("type["+type+"]类型不行辨认,没有匹配到可实例化的目标!");
}
}
public static void main(String[] args) {
Coffee latte = SimpleFactory.createInstance("latte");
System.out.println("创立的咖啡实例为:" + latte.getName());
Coffee cappuccino = SimpleFactory.createInstance("cappuccino");
System.out.println("创立的咖啡实例为:" + cappuccino.getName());
}

}

JAVA规划形式之工厂形式(三种工厂形式)

2.2 工厂办法形式

界说了一个创立目标的接口,但由子类决定要实例化的类是哪一个,工厂办法让类把实例化推延到了子类。

场景延伸:不同区域咖啡工厂受制于环境、质料等要素的影响,制作出的咖啡品种有限。我国咖啡工厂仅能制作卡布奇诺、拿铁,而美国咖啡工厂仅能制作美式咖啡、拿铁。

JAVA规划形式之工厂形式(三种工厂形式)

/**

界说一个笼统的咖啡工厂@author Lsj
*/

public abstract class CoffeeFactory {


/**
* 出产可制作的咖啡
* @return
*/
public abstract Coffee[] createCoffee();

}

/**

我国咖啡工厂@author Lsj
*

*/
public class ChinaCoffeeFactory extends CoffeeFactory {

@Override
public Coffee[] createCoffee() {
// TODO Auto-generated method stub
return new Coffee[]{new Cappuccino(), new Latte()};
}

}

/**

美国咖啡工厂@author Lsj
*

*/
public class AmericaCoffeeFactory extends CoffeeFactory {

@Override
public Coffee[] createCoffee() {
// TODO Auto-generated method stub
return new Coffee[]{new Americano(), new Latte()};
}

}

/**

工厂办法测验@author Lsj
*

*/
public class FactoryMethodTest {

static void print(Coffee[] c){
for (Coffee coffee : c) {
System.out.println(coffee.getName());
}
}
public static void main(String[] args) {
CoffeeFactory chinaCoffeeFactory = new ChinaCoffeeFactory();
Coffee[] chinaCoffees = chinaCoffeeFactory.createCoffee();
System.out.println("我国咖啡工厂能够出产的咖啡有:");
print(chinaCoffees);
CoffeeFactory americaCoffeeFactory = new AmericaCoffeeFactory();
Coffee[] americaCoffees = americaCoffeeFactory.createCoffee();
System.out.println("美国咖啡工厂能够出产的咖啡有:");
print(americaCoffees);
}

}

JAVA规划形式之工厂形式(三种工厂形式)

JAVA规划形式之工厂形式(三种工厂形式)

2.3 笼统工厂

供给一个接口,用于创立相关或依靠目标的宗族,而不需求清晰指定详细类。

在上述的场景上持续延伸:咖啡工厂做大做强,引入了新的饮品品种:茶、 碳酸饮料。我国工厂只能制作咖啡和茶,美国工厂只能制作咖啡和碳酸饮料。

假如用上述工厂办法办法,除掉对应的产品实体类还需求新增2个笼统工厂(茶制作工厂、碳酸饮料制作工厂),4个详细工厂完成。跟着产品的增多,会导致类爆破。

所以这儿引出一个概念产品宗族,在此比如中,不同的饮品就组成咱们的饮品宗族, 饮品宗族开端承当创立者的职责,担任制作不同的产品。

JAVA规划形式之工厂形式(三种工厂形式)

/**

笼统的饮料产品宗族制作工厂@author Lsj
*

*/
public interface AbstractDrinksFactory {

/**
* 制作咖啡
* @return
*/
Coffee createCoffee();
/**
* 制作茶
* @return
*/
Tea createTea();
/**
* 制作碳酸饮料
* @return
*/
Sodas createSodas();

}

/**

我国饮品工厂制作咖啡与茶@author Lsj
*

*/
public class ChinaDrinksFactory implements AbstractDrinksFactory {

@Override
public Coffee createCoffee() {
// TODO Auto-generated method stub
return new Latte();
}
@Override
public Tea createTea() {
// TODO Auto-generated method stub
return new MilkTea();
}
@Override
public Sodas createSodas() {
// TODO Auto-generated method stub
return null;
}

}

/**

美国饮品制作工厂制作咖啡和碳酸饮料@author Lsj
*

*/
public class AmericaDrinksFactory implements AbstractDrinksFactory {

@Override
public Coffee createCoffee() {
// TODO Auto-generated method stub
return new Latte();
}
@Override
public Tea createTea() {
// TODO Auto-generated method stub
return null;
}
@Override
public Sodas createSodas() {
// TODO Auto-generated method stub
return new CocaCola();
}

}

/**

笼统工厂测验类@author Lsj
*

*/
public class AbstractFactoryTest {


static void print(Drink drink){
if(drink == null){
System.out.println("产品:--" );
}else{
System.out.println("产品:" + drink.getName());
}
}
public static void main(String[] args) {
AbstractDrinksFactory chinaDrinksFactory = new ChinaDrinksFactory();
Coffee coffee = chinaDrinksFactory.createCoffee();
Tea tea = chinaDrinksFactory.createTea();
Sodas sodas = chinaDrinksFactory.createSodas();
System.out.println("我国饮品工厂有如下产品:");
print(coffee);
print(tea);
print(sodas);
AbstractDrinksFactory americaDrinksFactory = new AmericaDrinksFactory();
coffee = americaDrinksFactory.createCoffee();
tea = americaDrinksFactory.createTea();
sodas = americaDrinksFactory.createSodas();
System.out.println("美国饮品工厂有如下产品:");
print(coffee);
print(tea);
print(sodas);
}

}

JAVA规划形式之工厂形式(三种工厂形式)

3.总结

简略工厂:不能算是真实意义上的规划形式,但能够将客户程序从详细类解耦。

工厂办法:运用承继,把目标的创立托付给子类,由子类来完成创立办法,能够看作是笼统工厂形式中只要单一产品的状况。

笼统工厂:使目标的创立被完成在工厂接口所露出出来的办法中。

工厂形式能够协助咱们针对笼统/接口编程,而不是针对详细类编程,在不同的场景下按详细状况来运用。

参阅书本:

《HeadFirst 规划形式》