栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式学习笔记-----工厂模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式学习笔记-----工厂模式

来源

注意:此博客为本人观看黑马程序员学习教程时的课堂笔记,仅作本人复习使用。

- 课程来源:

视频

- 笔记改编人:

潘大星

工厂模式 咖啡店点餐系统

简单工厂模式

注:非23种设计模式中的一种

结构:

抽象产品:定义产品规范,描述产品主要特性具体产品:实现或者继承抽样产品的子类具体工厂:提供了创建产品的方法,调用者通过该方法来获取产品

对之前的改进:

优缺点:

优点:封装了创建对象的过程,可以通过参数直接获取对象,把对象的创建和业务逻辑层分开,避免修改客户代码,如果要实现新产品直接修改工厂类,而不需要在代码中修改,这样就降低了客户代码修改的可能性,更容易扩展缺点:增加新产品时还是需要修改工厂类的代码,违背“开闭原则” 静态工厂模式

注:非23种设计模式中的一种

    将CoffeeStore类中的createCoffee改为静态方法

    public class SimpleCoffeeFactory {
        public static Coffee createCoffee(String type){
            Coffee coffee=null;
            if ("american".equals(type)){
                coffee=new AmericanCoffee();
            }else if ("latte".equals(type)){
                coffee=new LatteCoffee();
            }else {
                throw new RuntimeException("对不起,您点的咖啡没有");
            }
            return coffee;
        }
    }
    

    CoffeeStore类调用createCoffee静态方法

    package factory.static_factory;
    
    public class CoffeeStore {
        public Coffee orderCoffee(String type){
            Coffee coffee = SimpleCoffeeFactory.createCoffee(type);
            coffee.addMilk();
            coffee.addSugar();
            return coffee;
        }
    }
    
工厂方法模式

定义一个创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类

结构

抽象工厂:提供创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品具体工厂:实现抽象工厂中的抽象方法,完成具体产品的创建抽象产品:定义了产品的规范,描述了产品的主要特性和功能具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,他同具体工厂之间一一对应

优缺点

优点

用户只需要知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创建过程在系统增加新的产品时只需要添加具体产品类和具体工厂类,无需对原工厂进行任何修改,满足开闭原则 缺点

每增加一个产品就要增加一个具体类和一个对应的具体工厂类,这增加了系统的复杂度 抽象工厂模式

之前的工厂方法模式中每个工厂只能生产一种产品

工厂方法模式只生产一个等级的产品,抽样工厂模式可生产多个等级的产品

结构

抽象工厂:提供创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象共厂模式有多个抽象产品具体产品:实现了抽象产品所定义的接口,由具体工厂来创建,他同具体工厂之间是多对一的关系

优缺点

优点:当一个产品组的多个对象被设计成一起工作时,他能保证客户端始终只使用同一个产品族的对象缺点:当产品组中需要增加一个产品时,所有的工厂类都要进行修改

使用场景

当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机,洗衣机,空调等

系统中有多个产品族,但每次只使用其中的某一族产品,如有人只喜欢穿某一品牌的衣服和鞋

系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构

如输入法换皮肤,一整套一起换。生成不同操作系统的程序。

模式扩展

简单工厂+配置文件解除耦合

    定义配置文件(bean.properties)

    american="com.pxy.pattern.factory.config_factory.AmericanCoffee
    latte="com.pxy.pattern.factory.config_factory.LatteCoffee"
    

    改进工厂类

    package com.pxy.pattern.factory.config_factory;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Properties;
    import java.util.Set;
    
    public class CoffeeFactory {
    
        //加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储
        //1.定义容器对象存储咖啡
        private static HashMap map = new HashMap<>();
    
        //2.加载配置文件,只需要加载一次
        static {
            //2.1创建properties对象
            Properties p = new Properties();
            //2.2调用p对象中的load方法进行配置文件的加载
            InputStream is = CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            try {
                p.load(is);
                //从p集合中获取全类名并创建对象
                Set 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);
        }
    }
      

    使用

    package com.pxy.pattern.factory.config_factory;
    
    public class Client{
        public static void main(String[] args) {
            Coffee coffee = CoffeeFactory.createCoffee("american");
            System.out.println(coffee.getName());
            System.out.println("=====================");
            Coffee latte = CoffeeFactory.createCoffee("latte");
            System.out.println(latte.getName());
        }
    }
    

    静态成员变量用来存储创建的对象(键存储的是名称,值存储的是对应的对象),而读取配置文件以及创建对象写在静态代码块中,目的就是只需要执行一次

    转载请注明:文章转载自 www.mshxw.com
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号