工厂设计模式
- 1.概述
- 2.简单工厂模式
- 2.1 结构
- 2.2 实现
- 2.3 优缺点
- 2.4 扩展
- 3.工厂方法模式
- 3.1 概述
- 3.2 结构
- 3.3 实现
- 3.4 优缺点
- 4.抽象工厂模式
- 4.1 概述
- 4.2 结构
- 4.3 实现
- 4.4 优缺点
- 4.5 应用场景
- 5.扩展模式
- 5.1 第一步:定义配置文件
- 5.2 改写工厂类
- 6.JDK源码解析—Collection.iterator方法
1.概述
例子
2.简单工厂模式
2.1 结构
2.2 实现
package com.lxg.pattern.factory.factory_simple;/*** 咖啡类*/
public abstract class Coffee {public abstract String getName();public void addSugar(){System.out.println("加糖");}public void addMilk(){System.out.println("加奶");}
}
package com.lxg.pattern.factory.factory_simple;/*** 美式咖啡*/
public class AmericanCoffee extends Coffee {public String getName() {return "美式咖啡";}
}
package com.lxg.pattern.factory.factory_simple;/*** 拿铁咖啡*/
public class LatteCoffee extends Coffee {public String getName() {return "拿铁咖啡";}
}
package com.lxg.pattern.factory.factory_simple;/*** 简单咖啡工厂类,用来生产咖啡** 简单工厂处理创建对象的细节,有了此简单工厂对象,在CoffeeStore对象中如果需要Coffee对象,只需要在工厂类* 中获取就行。这样解除了Coffee类和CoffeeStore类的耦合,但是这样也产生了新的耦合,即工厂对象和CoffeeStore* 的耦合以及工厂对象跟Coffee类的耦合。** 有了工厂对象,如果后期增加了更多的咖啡,则势必对工厂对象进行改造,违反了开闭原则。** 简单工厂:* 优点:* 封装了创建对象的细节,可以通过参数直接获取对象,把对象的创建和业务逻辑层分开,这样避免以后修改客户端代码,* 如果要实现新的产品,直接修改工厂类就行了,而不需要在业务代码中修改,这样就降低了客户代码修改的可能性,更加* 容易扩展。** 缺点:* 增加新的产品的时候,还是需要修改工厂类,违背了设计原则的开闭原则。**/
public class SimpleCoffeeFactory {public Coffee createCoffee(String type){//声明Coffee类型的变量,根据不同的类型创建不同的coffee子类对象Coffee coffee = null;if("american".equals(type)){coffee = new AmericanCoffee();}else if("latte".equals(type)){coffee = new LatteCoffee();}else{throw new RuntimeException("对不起,您点的咖啡没有");}return coffee;}
}
分析
2.3 优缺点
优点:
缺点:
2.4 扩展
静态工厂
package com.lxg.pattern.factory.factory_static;/*** 静态工厂方法模式*/
public class SimpleCoffeeFactory {public static Coffee createCoffee(String type){//声明Coffee类型的变量,根据不同的类型创建不同的coffee子类对象Coffee coffee = null;if("american".equals(type)){coffee = new AmericanCoffee();}else if("latte".equals(type)){coffee = new LatteCoffee();}else{throw new RuntimeException("对不起,您点的咖啡没有");}return coffee;}
}
3.工厂方法模式
3.1 概述
3.2 结构
工厂方法模式的主要角色:
3.3 实现
package com.lxg.pattern.factory.factory_method;/*** 抽象工厂:如果增加新的种类咖啡,只需要增加一个这个接口的实现类就行。** 优点:* - 用户只需要知道具体的工厂名字就能得到所需要的产品,无需知道产品的具体创建过程* - 在系统增加新的产品时只需要添加具体产品类对应的具体工厂类,无需对原工厂类进行任何修改,满足开闭原则** 缺点:* - 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂性*/
public interface CoffeeFactory {//创建咖啡对象的方法Coffee createCoffee();
}
package com.lxg.pattern.factory.factory_method;/*** 美式咖啡工厂对象,专门用来生产美式咖啡的*/
public class AmericanCoffeeFactory implements CoffeeFactory{public Coffee createCoffee() {return new AmericanCoffee();}
}
package com.lxg.pattern.factory.factory_method;/*** 拿铁咖啡工厂,专门用来生产拿铁咖啡*/
public class LatteCoffeeFactory implements CoffeeFactory{public Coffee createCoffee() {return new LatteCoffee();}
}
package com.lxg.pattern.factory.factory_method;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;}
}
分析
3.4 优缺点
优点:
缺点:
4.抽象工厂模式
4.1 概述
4.2 结构
抽象工厂模式的主要角色如下:
4.3 实现
package com.lxg.pattern.factory.factory_abstract;public interface DessertFactory {//生产咖啡的功能Coffee createCoffee();//生产甜品的功能Dessert createDessert();
}
package com.lxg.pattern.factory.factory_abstract;/*** 没事风味的甜品工厂,可以生产美式咖啡和抹茶慕斯*/
public class AmericanDessertFactory implements DessertFactory{public Coffee createCoffee() {return new AmericanCoffee();}public Dessert createDessert() {return new MatchaMousse();}
}
package com.lxg.pattern.factory.factory_abstract;/*** 意大利风味的甜品工厂,能生产拿铁和提拉米苏*/
public class ItalyDessertFactory implements DessertFactory{public Coffee createCoffee() {return new LatteCoffee();}public Dessert createDessert() {return new Tiramisu();}
}
分析
4.4 优缺点
优点:
缺点:
4.5 应用场景
5.扩展模式
简单工厂+配置文件解除耦合
5.1 第一步:定义配置文件
american=com.lxg.pattern.factory.factory_config.AmericanCoffee
latte=com.lxg.pattern.factory.factory_config.LatteCoffee
5.2 改写工厂类
package com.lxg.pattern.factory.factory_config;import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;public class CoffeeFactory {//加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储//定义容器对象存储咖啡对象private static HashMap<String,Coffee> map = new HashMap<String, Coffee>();//加载配置文件,只需要加载一次static {Properties p = new Properties();InputStream in = CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");try {p.load(in);//从p集合中获取全限定类名并创建对象Set<Object> keys = p.keySet();for (Object key:keys) {String className = p.getProperty((String) key);//通过反射技术创建对象Class clazz = Class.forName(className);Coffee coffee = (Coffee) clazz.newInstance();//将名称和对象存储到容器中map.put((String)key,coffee);}} catch (Exception e) {e.printStackTrace();}}public static Coffee createCoffee(String name){return map.get(name);}
}
分析
6.JDK源码解析—Collection.iterator方法
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);}}
}
本文链接:https://my.lmcjl.com/post/8646.html
展开阅读全文
4 评论