zoukankan      html  css  js  c++  java
  • 二、由对象工厂生成对象的设计模式:工厂模式

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

    什么时候使用工厂模式

    1.当一个类不知道它所必须创建的对象的类的时候。
    2.当一个类希望由它的子类来指定它所创建的对象的时候。
    3.当将创建对象的职责委托给多个帮助类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候。

    使用工厂模式的好处

    • ① new对象的话,一旦代码有变化或者拓展,就必须改变原来的代码,也就是说你的代码并“对修改关闭”
    • ② 解耦,便于更新和维护;

    工厂模式的应用场景

    • 一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
    • 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏
    • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无需关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
       

    工厂模式的分类

    1. 简单工厂模式(Simple Factory)
    2. 工厂方法模式(Factory Method)
    3. 抽象工厂模式(Abstract Factory)

    这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可,这本为使用《Java与模式》的分类方法。

    实现工厂模式的几种方法

    简单工厂实例

    你会建立一个专门生产Sample实例的工厂:

    package DesignPattern.simplefactory;
    
    public class BoxFactory {
    
        public  static Box creatBox(Class<? extends Box> c){
            Object box = null;
    
            try {
                box = Class.forName(c.getName()).newInstance();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
    
            return (Box) box;
        }
    }
    
    RedBox.class
    
    package DesignPattern.simplefactory;
    
    public class RedBox  implements   Box{
        @Override
        public void doSome() {
            System.out.println("this is red box");
        }
    }
    
    Box.class
    
    package DesignPattern.simplefactory;
    
    public interface Box {
        void doSome();
    }
    
    
     Box instance = BoxFactory.creatBox(RedBox.class); 那么在你的程序中,如果要创建instance 的实列时候可以使用

    这样,在整个就不涉及到instance 的具体的实现类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理。

    使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Box类的接口,产品接口下有Box接口的实现类,如RedBox,其次要有一个Factory类,用来生成产品Box接口的具体实例。

    抽象工厂实例

    就拿生活中的一个实例来描述如何创建一个抽象工厂

    小米工厂,会创建小米电脑,和小米本

    苹果工厂,会创建苹果手机,和苹果本

    而小米工厂和苹果工厂都隶属于工厂,小米手机和苹果手机都是手机,反之电脑也是一样

    有上述场景可以写出下面的代码

    (1)创建相关接口:

    手机

    public interface Moible {
        void showMoible();
    }
    

    电脑

    public interface Computer {
        void showComputer();
    }
    


    (2)创建接口对应实现类:

    小米手机

    public class XiaoMiMoible implements  Moible{
        @Override
        public void showMoible() {
            System.out.println("这是一个小米手机");
        }
    }
    


    小米电脑

    public class XiaoMiComputer implements  Computer{
        @Override
        public void showComputer() {
            System.out.println("这是个小米本");
        }
    }

    苹果手机

    public class IphoneMoible implements  Moible {
        @Override
        public void showMoible() {
            System.out.println("这是一个苹果手机");
        }
    }
    

    苹果电脑

    public class IphoneComputer implements  Computer{
        @Override
        public void showComputer() {
            System.out.println("这是个苹果本");
        }
    }
    


    (3)创建工厂接口

    public interface Factory {
        Computer createComputer();
        Moible createMoible();
    }
    


    (4)创建具体工厂

    小米工厂创建小米电脑和小米手机

    public class XiaoMiFactory  implements  Factory{
    
        @Override
        public Computer createComputer() {
            return new XiaoMiComputer();
        }
    
        @Override
        public Moible createMoible() {
            return new XiaoMiMoible();
        }
    }
    

    苹果工厂创建苹果手机和苹果电脑

    public class IphoneFactory  implements  Factory{
    
        @Override
        public Computer createComputer() {
            return new IphoneComputer();
        }
    
        @Override
        public Moible createMoible() {
            return new IphoneMoible();
        }
    }
    

    上面是一个简单的例子,个人之前没有用过,也是最近看工厂模式才试着写的。

    简单工厂的创建和抽象工厂都离不开借口以及接口的实现,通过写了一系列代码感觉,抽象工厂还需要将工厂写成抽象的,在根据实际需求写工厂的实例来获得不同的对象。

    面试时候可能问到的问题

    面试必考点之工厂模式

    可能文中会存在一些问题,请指出,方便及时修改,也防止对别人产生误导

  • 相关阅读:
    pychram 2018-01 安装pyQT5报错
    pyqt 8行内就可以跑一个浏览器
    sql server无log ldf日志文件附件mdf数据库重新生成ldf日志文件
    解决Specifying a namespace in include()withou providing an app_name
    Java 连接池的工作原理(转)
    使用from __future__ import unicode_literals时要注意的问题
    详细介绍Redis的几种数据结构以及使用注意事项(转)
    再谈Redis应用场景(转)
    Redis的LRU机制(转)
    深入理解Redis主键失效原理及实现机制(转)
  • 原文地址:https://www.cnblogs.com/shenyanrushang/p/10852485.html
Copyright © 2011-2022 走看看