• 简单工厂


    简单工厂模式解释: 

           简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

     简单工厂模式中包含的角色及其相应的职责如下:

           工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。

           抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。

           具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

    简单工厂模式深入分析

           简单工厂模式解决的问题是如何去实例化一个合适的对象。

           简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。

           具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

           如果简单工厂模式所涉及到的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色;如果具体产品之间有功能的逻辑或,我们就必须把这些共同的东西提取出来,放在一个抽象类中,然后让具体产品继承抽象类。为实现更好复用的目的,共同的东西总是应该抽象出来的。

    工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
    1. 简单工厂模式(Simple Factory)
    2. 工厂方法模式(Factory Method)
    3. 抽象工厂模式(Abstract Factory)
    这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可,这本为使用《Java与模式》的分类方法。
    在什么样的情况下我们应该记得使用工厂模式呢?大体有两点:
    1.在编码时不能预见需要创建哪种类的实例。
    2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
    工厂模式能给我们的OOD、OOP带来哪些好处呢??

    简单工厂模式

    这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
    它由三种角色组成:
    工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
    抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
    具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。

     //抽象产品  

    abstract class Car{  
        private String name;  
          
        public abstract void drive();  
          
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
    }  
    //具体产品  
    class Benz extends Car{  
        public void drive(){  
            System.out.println(this.getName()+"----go-----------------------");  
        }  
    }  
      
    class Bmw extends Car{  
        public void drive(){  
            System.out.println(this.getName()+"----go-----------------------");  
        }  
    }  
      
    //简单工厂  
    class Driver{  
        public static Car createCar(String car){  
            Car c null;  
            if("Benz".equalsIgnoreCase(car))  
                c new Benz();  
            else if("Bmw".equalsIgnoreCase(car))  
                c new Bmw();  
            return c;  
        }  
    }  
      
    //老板  
    public class BossSimplyFactory {  
      
        public static void main(String[] args) throws IOException {  
            //老板告诉司机我今天坐奔驰  
            Car car = Driver.createCar("benz");  
            car.setName("benz");  
             //司机开着奔驰出发  
            car.drive();  
        }  
    <span style="font-family: courier new,courier;">}</span>  
     
     
    //抽象产品  
    abstract class Car{  
        private String name;  
          
        public abstract void drive();  
          
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
    }  
    //具体产品  
    class Benz extends Car{  
        public void drive(){  
            System.out.println(this.getName()+"----go-----------------------");  
        }  
    }  
    class Bmw extends Car{  
        public void drive(){  
            System.out.println(this.getName()+"----go-----------------------");  
        }  
    }  
      
      
    //抽象工厂  
    abstract class Driver{  
        public abstract Car createCar(String car) throws Exception;  
    }  
    //具体工厂(每个具体工厂负责一个具体产品)  
    class BenzDriver extends Driver{  
        public Car createCar(String car) throws Exception {  
            return new Benz();  
        }  
    }  
    class BmwDriver extends Driver{  
        public Car createCar(String car) throws Exception {  
            return new Bmw();  
        }  
    }  
      

    //老板   public class Boss{          public static void main(String[] args) throws Exception {           Driver d new BenzDriver();           Car c = d.createCar("benz");            c.setName("benz");          c.drive();       }  } 











  • 相关阅读:
    基于注解的springmvc开发
    判断两数之和
    redux-saga call 和 fork的区别
    滚动轴滚动方向判断
    原生方法scrollTo支持滚动特效
    npm下载包失败的几个原因
    关闭vscode打开新文件自动关闭预览文件功能
    在本地文件当中package.json的作用
    解决crlf 和 lf不同带来的冲突问题
    package-lock.json 文件的作用
  • 原文地址:https://www.cnblogs.com/1234wwww/p/6599767.html
Copyright © 2020-2023  润新知