zoukankan      html  css  js  c++  java
  • 工厂模式

    简单工厂模式

    • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

    • 简单工厂模式是工厂模式家族中最简单实用的模式

    • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)

    • 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.

    • 手机制造顶层接口

    public interface Phone {
        void make();
    }
    • 小米制造商

    public class XiaoMiPhone implements Phone {
        @Override
        public void make() {
            System.out.println("制造了一台小米手机");
        }
    }
    • 华为制造商

    public class HuaWeiPhone implements  Phone{
        @Override
        public void make() {
            System.out.println("制造了一台华为手机");
        }
    }
    • 手机制造代工厂(富士康)

    public class PhoneFactory {
        public Phone makePhone(String phoneType){
            if ("xiaomi".equals(phoneType)){
                return new XiaoMiPhone();
            }else if ("huawei".equals(phoneType)){
                return new HuaWeiPhone();
            }
            return null;
        }
    }
    • 用户需求方

    public class TestMain {
        public static void main(String[] args) {
            PhoneFactory phoneFactory = new PhoneFactory();
            Phone xiaomi = phoneFactory.makePhone("xiaomi");
            xiaomi.make();
            Phone huawei = phoneFactory.makePhone("huawei");
            huawei.make();
        }
    }
    • 类图如下所示

    工厂方法模式

    • 和简单工厂模式相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,而不是由一个大工厂聚合生产

    • Phone 、XiaoMiPhone、HuaWeiPhone 类的不变

    • 新增抽象工厂类、小米工厂类、华为工厂类即可

    • 抽象工厂累

    public interface AbstractFactory {
        Phone makePhone();
    }
    • 小米工厂类

    public class XiaoMiFactory implements AbstractFactory {
        @Override
        public Phone makePhone() {
            // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
            // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。像简单工厂模式一一致
            return new XiaoMiPhone();
        }
    }
    • 华为工厂类

    public class HuaWeiFactory implements AbstractFactory{
        @Override
        public Phone makePhone() {
            // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
            // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。像简单工厂模式一一致
            return new HuaWeiPhone();
        }
    }
    • 用户需求方

    public class TestMain {
        public static void main(String[] args) {
            AbstractFactory xiaoMiFactory = new XiaoMiFactory();
            AbstractFactory huaWeiFactory = new HuaWeiFactory();
            Phone xiaomi = xiaoMiFactory.makePhone();
            Phone huawei = huaWeiFactory.makePhone();
            xiaomi.make();
            huawei.make();
        }
    }
    • 类图如下所示

    抽象工厂模式

    • 定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类

    • 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

    • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)

    • 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

    • 上面的工厂模式都是在围绕手机在生产,如果这个时候,我们添加一个PC领域进去该如何玩呢?

    • 手机制造顶级接口

    public interface Phone {
        void make();
    }
    • 小米手机制造商

    public class XiaoMiPhone implements Phone {
        @Override
        public void make() {
            System.out.println("制造了一台小米手机");
        }
    }
    • 华为手机制造商

    public class HuaWeiPhone implements Phone {
        @Override
        public void make() {
            System.out.println("制造了一台华为手机");
        }
    }
    • 笔记本制造顶级接口

    public interface PC {
        void make();
    }
    • 小米笔记本制造商

    public class XiaoMiPC implements PC{
        @Override
        public void make() {
            System.out.println("生产了一台小米笔记本");
        }
    }
    • 华为笔记本制造商

    public class HuaWeiPC implements PC{
        @Override
        public void make() {
            System.out.println("生产了一台华为笔记本");
        }
    }
    • 代工厂顶级接口

    public interface AbstractFactory {
        Phone makePhone();
        PC makePC();
    }
    • 小米代工厂制造接口

    public class XiaoMiFactory implements AbstractFactory {
        @Override
        public Phone makePhone() {
            // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
            // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
            return new XiaoMiPhone();
        }
    ​
        @Override
        public PC makePC() {
            // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
            // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
            return new XiaoMiPC();
        }
    }
    • 华为代工厂制造接口

    public class HuaWeiFactory implements AbstractFactory {
        @Override
        public Phone makePhone() {
            // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
            // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
            return new HuaWeiPhone();
        }
    ​
        @Override
        public PC makePC() {
            // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
            // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
            return new HuaWeiPC();
        }
    }
    • 需求方

    public class TestMain {
        public static void main(String[] args) {
            AbstractFactory xiaoMiFactory = new XiaoMiFactory();
            AbstractFactory huaWeiFactory = new HuaWeiFactory();
            Phone xiaomi = xiaoMiFactory.makePhone();
            PC xiaomiPC = xiaoMiFactory.makePC();
            Phone huawei = huaWeiFactory.makePhone();
            PC huaweiPC = huaWeiFactory.makePC();
            xiaomi.make();
            xiaomiPC.make();
            huawei.make();
            huaweiPC.make();
        }
    }
    • 类图如下所示

    • 此时,如果我们觉得手机和笔记本都已经玩腻了,想进军造车行业

      • 定义造成顶级接口

      • 定义造车品牌实现接口,比如小鹏汽车,蔚来汽车等

      • 此时增加代工顶级接口一个允许生产汽车的行为,并写一个汽车代工厂即可工厂

      • 扩展性就大大的增加了

    工厂模式小结

    • 工厂模式的意义

      • 将实例化对象的代码提取出来,放到一个类中统一管理维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

    • 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)

    • 设计模式的依赖抽象原则

      • 创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回

      • 不要让类继承具体类,而是继承抽象类或者是实现 interface(接口)

      • Ø 不要覆盖基类中已经实现的方法。

    .

  • 相关阅读:
    Asp.net 文件下载,中文文件名出现乱码
    存储过程中执行动态Sql语句
    SQLServer : EXEC和sp_executesql的区别
    C# 从服务器下载文件代码
    在windows 7 上为 sqlserver 2008 启用远程访问
    数字求和
    大道至简第一章读后感
    作业
    SharePoint2013 App 开发中 自定义网站栏,内容类型,列表。
    SharePoint2013 App开发模式
  • 原文地址:https://www.cnblogs.com/msi-chen/p/14489242.html
Copyright © 2011-2022 走看看