设计模式—工厂设计模式

工厂设计模式

    • 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 评论

留下您的评论.