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

    1,工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

    利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。

    将选择实现类、创建对象统一管理和。从而调用跟我们的实现类解耦

    简单工厂:

    简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知到一些指定的参数

    定义一个总的接口:

    public interface Car {
        public void produce();
    
    }

    定义接口下的一些子类:

    public class BMW implements Car {
        @Override
        public void produce() {
            System.out.println("宝马汽车生产。。。");
        }
    }
    class Ferrari implements Car {
        @Override
        public void produce() {
            System.out.println("法拉利生产。。。");
        }
    
    }
    class Buick implements Car {
        @Override
        public void produce() {
            System.out.println("别克汽车生产。。。");
        }
    
    }

    定义一个工厂,创建一个方法,来获得这些实例

    public class CarFactroy {
        public static Car getCar(String name) {
            
            if (StringUtils.isEmpty(name)) {
                return null;
            }
            if (name.equals("BMW")) {
                return new BMW();
            }
            if (name.equals("Ferrari")) {
                return new BMW();
            }
            if (name.equals("Buick")) {
                return new Buick();
            }
            return null;
    
        }
    
    }

    通过传入指定的参数,通过工厂生产不同的对象

    public class Client {
        public static void main(String[] args) {
            Car car = CarFactroy.getCar("BMW");
            car.produce();
        }
    
    }

    简单工厂的缺点:如果对象很多,再对象工厂类里面就会维护的非常困难。

    工厂方法:

    工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

    简单工厂到工厂方法的演变,简单工厂的工厂不是生成对象的角色了,交给其他工厂去完成...

    比如一个汽车会有好品牌,如果用简单工厂的话,每个品牌都用一个对象来维护,就会难以维护,尝试工厂方法:

    定义个接口:

    public interface Car {
        public void produce(String name);
    }

    定义要接口下的子类:

    public class BMW implements Car {
        @Override
        public void produce(String name) {
            System.out.println("宝马汽车" + name + "生产。。。");
        }
    }
    
    class Ferrari implements Car {
        @Override
        public void produce(String name) {
            System.out.println("法拉利" + name + "生产。。。");
        }
    
    }
    
    class Buick implements Car {
        @Override
        public void produce(String name) {
            System.out.println("别克汽车" + name + "生产。。。");
        }
    
    }

    定义汽车工厂:

    //用来生产汽车的工厂 
    public interface CarFactroy {
    
        public Car getCar(String name);
    
    }

    定义工厂下面的子类工厂(具体生产的某型号的工厂)

    public class BMWFactory implements CarFactroy {
    
        @Override
        public Car getCar(String name) {
            return new BMW();
        }
    }
    class FerrariFactory implements CarFactroy {
    
        @Override
        public Car getCar(String name) {
            return new Ferrari();
        }
    
    }
    
    class BuickFactory implements CarFactroy {
    
        @Override
        public Car getCar(String name) {
            return new Buick();
        }
    
    }

    生产不同型号的汽车:

    public class Client {
        public static void main(String[] args) {
            //BMW工厂
            CarFactroy carFactroy = new BMWFactory();
            Car X5 = carFactroy.getCar("BMW X5");
            X5.produce("X5");
            
            Car X7 = carFactroy.getCar("BMW X7");
            X5.produce("X7");
            
        }
    
    }

     3 ,抽象工厂

    抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。

    例如上面的例子,每个品牌的汽车生产厂,汽车生产都要生产发动机,生产轮胎,可将具体的产品抽象为工厂

    定义个工厂:这个工厂更像是组装厂,工厂的工厂,

    //用来组装的工厂
    public interface CarFactroy {
    
        //生产发动机 
        Engine assemblyEngine();
        
        //生产论轮胎
        Tyre assemblyTyre();
    
    }

    继续定义具体的发送机的工厂,轮胎的工厂

    //生产发动机
    public interface Engine {
        
        //压力测试
        void pressureTest();
        
        //功能测试
        void eolTest();
    
    }
    public interface Tyre {
        
        //螺丝测试
        void screwTest();
        
    }

    具体的实现:

    public class BMWEngine implements Engine {
    
        @Override
        public void pressureTest() {
            System.out.println("宝马发动机压力测试");
        }
    
        @Override
        public void eolTest() {
            System.out.println("宝马发动机功能测试");
        }
    
    }
    
    class BMWTyre implements Tyre {
    
        @Override
        public void screwTest() {
            System.out.println("宝马轮胎螺丝测试");
        }
    
    }

    实现组装的工厂:

    public class BMWFactory implements CarFactroy {
    
        @Override
        public Engine assemblyEngine() {
    
            return new BMWEngine();
        }
    
        @Override
        public Tyre assemblyTyre() {
            return new BMWTyre();
        }
    
    }

    Client:

    public class Client {
        
        public static void main(String[] args) {
            CarFactroy carFactroy = new BMWFactory();
            Engine assemblyEngine = carFactroy.assemblyEngine();
            Tyre assemblyTyre = carFactroy.assemblyTyre();
            assemblyEngine.pressureTest();
            assemblyTyre.screwTest();
        }
    
    }
  • 相关阅读:
    keycloak~管理平台的查询bug与自定rest中文检索
    gRPC四种模式、认证和授权,C#实战演示
    asp.net core 集成JWT
    从不同使用场景来介绍git的基础命令
    用scikit-learn进行LDA降维——以前没有注意,原来LDA降维竟然这么好用!对无监督的任务使用PCA进行降维,对有监督的则应用LDA。
    ID3/Cart/C4.5区别
    超参数调优——google Vizier采用迁移学习的思想,主要是从之前调参的经验中学习,为新算法提出最佳超参数
    sklearn 绘制roc曲线
    原来ROC曲线更加健壮地反映模型的效果,看来还是比较关键的(就像逻辑回归,你总是希望模型让0/1分类的数据尽可能都向两端靠对不对,ROC就是反映这个好坏的指标)
    word2vec的原理——根据单词的上下文去预测单词出现,然后让整体的概率最大化。学习这样一个神经网络,然后选择隐藏作为vector表示。最初单词是onehot编码!
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11089480.html
Copyright © 2011-2022 走看看