• 工厂模式


    工厂模式

    概述

    在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。

    使用场景

    假设一家汽车制造公司,一直在使用一套程序生产比亚迪型号的汽车,现在出现了大批量的特斯拉汽车的订单,如果在原来的程序上进行修改的话就会违反开闭原则,同时如果后期又多了其他品牌的订单,则再原程序上修改显得不现实。

    解决方法

    该公司分开出来两个制造工厂,BYDFactory和TeslaFactory,去分别制造该类型的汽车。公司接到订单后,只需要派给不同的公司即可。

    实现

    // 抽象工厂类接口
    public interface CarFactory {
        public Car produce();
    }
    
    // 抽象产品类接口
    // public interface Car {
        String show();
    }
    
    // 特斯拉工厂
    public class TeslaFactory implements CarFactory{
        @Override
        public Car produce() {
        		// 只生产特斯拉
            return new TeslaCar();
        }
    }
    
    // 比亚迪工厂
    public class BYDFactory implements CarFactory{
        @Override
        public Car produce() {
        		// 只生产比亚迪
            return new BYDCar();
        }
    }
    
    // 比亚迪汽车
    public class BYDCar implements Car{
        @Override
        public String show() {
            return "Build Your Dream";
        }
    }
    
    // 特斯拉汽车
    public class TeslaCar implements Car{
        @Override
        public String show() {
            return "Go Electric";
        }
    }
    
    // 制造汽车
    public class Client {
        public static void main(String[] args) {
            // 不关心创建过程,只关心调用者是谁
            Car car = new BYDFactory().produce();
            String show = car.show();
            System.out.println(show);
        }
    }
    
    

    总结

    1. 需要有抽象工厂类和抽象产品类,工厂类生产各自的产品。
    2. 遵循开闭原则,不会对原程序进行修改。
    3. 单一功能指责,每个工厂的职责互不影响,比如特斯拉制造的四驱系统,比亚迪制造后驱系统。
    4. 缺点就是可能随着品牌增多,导致具体工厂类和具体产品类数量变多。

    抽象工厂模式

    概述

    能创建一系列相关对象,而不需要制定具体类。

    使用场景

    电脑组装厂要组装联想和戴尔品牌的电脑,两种品牌的电脑采用的CPU、内存、硬盘都是不一样的厂家,如果不区分使用一套程序去制造非常困难,而且后期CPU换了型号,还要对应用程序大动手脚。

    解决方法

    应当采用抽象工厂模式,抽象出一条整链的原材料,如果后期修改的话对于上一层调用的地方不用修改,只需要修改具体工厂的方法。比如联想将CPU换为AMD只需要修改联想厂家的方法。

    实现

    // 抽象工厂
    public interface ComputerFactory {
        CPU createCpu();
    
        Memory createMemory();
    }
    
    // 抽象产品
    public interface CPU {
        void work();
    }
    
    public interface Memory {
        default void work() {
            System.out.println("默认内存");
        }
    }
    
    // 具体产品
    public class IntelCpu implements CPU{
        @Override
        public void work() {
            System.out.println("intel CPU");
        }
    }
    
    public class AppleCpu implements CPU{
        @Override
        public void work() {
            System.out.println("apple cpu");
        }
    }
    
    // 具体工厂
    public class DellFactory implements ComputerFactory {
    		// apple cpu
        @Override
        public CPU createCpu() {
            return new AppleCpu();
        }
    
        @Override
        public Memory createMemory() {
            return new Memory() {
            };
        }
    }
    
    
    public class LenovoFactory implements ComputerFactory {
    		// intel cpu
        @Override
        public CPU createCpu() {
            return new IntelCpu();
        }
    
        @Override
        public Memory createMemory() {
            return new Memory() {
            };
        }
    }
    
    
    public class Client {
        public static void main(String[] args) {
        		// 抽象工厂可以生产不同具体类一系列产品
            DellFactory factory = new DellFactory();
            factory.createCpu().work();
            factory.createMemory().work();
        }
    }
    

    总结

    1. 与普通工厂模式的区别就是每一个工厂不是创建单个对象,而是创建多个对象。
  • 相关阅读:
    动手搭建 Web 框架深入了解 Web 框架的本质
    HTTP 协议
    Objectarx 判断点是否在多段线内部
    最小面积圆覆盖
    最小面积矩形覆盖
    objectarx之(点集)凸包算法
    Objectarx之相交矩形求并集 面域转多段线
    实时监控linux主机网络活动,上传下载速度
    block SSH attacks on Linux with denyhosts (centOS7)
    ASCII Camera
  • 原文地址:https://www.cnblogs.com/jimmyhe/p/15063605.html
Copyright © 2020-2023  润新知