赞
踩
设计模式系列文章
5 种创建型模式
7 种结构型模式
11 种行为型模式
需求:设计一个咖啡店点餐系统
解耦
简单工厂包含如下角色:
现在使用简单工厂对上面案例进行改进,类图如下:
工厂类代码如下:
public class SimpleCoffeeFactory {
public Coffee createCoffee(String type) {
Coffee coffee = null;
if("americano".equals(type)) {
coffee = new AmericanoCoffee();
} else if("latte".equals(type)) {
coffee = new LatteCoffee();
}
return coffee;
}
}
public class SimpleCoffeeFactory {
public static Coffee createCoffee(String type) {
Coffee coffee = null;
if("americano".equals(type)) {
coffee = new AmericanoCoffee();
} else if("latte".equals(type)) {
coffee = new LatteCoffee();
}
return coffe;
}
}
工厂的子类
工厂方法模式的主要角色:
使用工厂方法模式对上例进行改进,类图如下:
抽象工厂:
public interface CoffeeFactory {
//创建咖啡对象的方法
Coffee createCoffee();
}
具体工厂:
// 拿铁咖啡工厂,专门用来生产拿铁咖啡
public class LatteCoffeeFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
}
// 美式咖啡工厂对象,专门用来生产美式咖啡
public class AmericanCoffeeFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new AmericanCoffee();
}
}
咖啡店类:
public class CoffeeStore {
private CoffeeFactory factory;
public void setFactory(CoffeeFactory factory) {
this.factory = factory;
}
//点咖啡功能
public Coffee orderCoffee() {
Coffee coffee = factory.createCoffee();
//加配料
coffee.addMilk();
coffee.addsugar();
return coffee;
}
}
优点
具体工厂的名称
就可得到所要的产品,无须知道产品的具体创建过程缺点
工厂方法模式中考虑的是一类产品
的生产,如畜牧场只养动物、电视机厂只生产电视机
工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类)
的产品
本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族
下图所示横轴是产品等级,也就是同一类产品
纵轴是产品族,也就是同一品牌的产品,同一品牌的产品产自同一个工厂
抽象工厂模式是工厂方法模式的升级版本
工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品
抽象工厂模式的主要角色如下:
抽象工厂:
public interface DessertFactory {
//生产咖啡的功能
Coffee createCoffee();
//生产甜品的功能
Dessert createDessert();
}
具体工厂:
//美式甜点工厂-生产美式咖啡和抹茶慕斯
public class AmericanDessertFactory implements DessertFactory {
@Override
public Coffee createCoffee() {
return new AmericanCoffee();
}
@Override
public Dessert createDessert() {
return new MatchaMousse();
}
}
//意大利风味甜点工厂-生产拿铁咖啡和提拉米苏甜品
public class ItalyDessertFactory implements DessertFactory {
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
@Override
public Dessert createDessert() {
return new Tiramisu();
}
}
客户端:
public class Client {
public static void main(String[] args) {
//创建的是意大利风味甜品工厂对象
//ItalyDessertFactory factory = new ItalyDessertFactory();
AmericanDessertFactory factory = new AmericanDessertFactory();
//获取拿铁咖啡和提拉米苏甜品
Coffee coffee = factory.createCoffee();
Dessert dessert = factory.createDessert();
System.out.println(coffee.getName());
dessert.show();
}
}
如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类
优点
缺点
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("令狐冲");
list.add("风清扬");
list.add("任我行");
//获取迭代器对象
Iterator<String> it = list.iterator();
//使用迭代器遍历
while(it.hasNext()) {
String ele = it.next();
System.out.println(ele);
}
}
}
通过类图看看结构:
Itr实现Iterator接口类,是ArrayList内部类
)Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。