zoukankan      html  css  js  c++  java
  • 设计模式二之工厂模式

    一、工厂模式  

      工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

    优点:

    • 一个调用者想创建一个对象,只要知道其名称就可以了,降低了耦合度。
    • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。使得代码结构更加清晰。
    • 屏蔽产品的具体实现,调用者只关心产品的接口。

    1.1、简单工厂模式

            实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例,这个比较简单例子就不写了。但是简单工厂模式不符合开闭原则。

    1.2、工厂方法模式

            工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。 提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。对扩展友好,无需修改原有的代码。但是也新增了好多的文件,从理论上讲,工厂方法模式有优势,从实际上讲,还是使用简单工厂模式占优势,可见没有绝对的好坏。

      交通工具类接口

    package com.duchong.factorymodel;
    
    /**
     * Created by DUCHONG on 2018/3/29.
     */
    public interface Car {
    
         void move();
    }
    

      具体的交通工具实现类

    package com.duchong.factorymodel;
    
    /**
     * @author DUCHONG
     * @since 2018-03-29 14:05
     **/
    public class Bus implements Car{
        @Override
        public void move() {
            System.out.println("Bus move slowly");
        }
    }
    
    package com.duchong.factorymodel;
    
    /**
     * @author DUCHONG
     * @since 2018-03-29 14:06
     **/
    public class Taxi implements Car{
        @Override
        public void move() {
            System.out.println("Taxi move faster");
        }
    }

      交通工具的工厂类接口

    package com.duchong.factorymodel;
    
    /**
     * Created by DUCHONG on 2018/3/29.
     */
    public interface CarFactory {
    
        Car getCar();
    }
    

      具体的交通工具工厂类的实现类

    package com.duchong.factorymodel;
    
    /**
     * @author DUCHONG
     * @since 2018-03-29 14:08
     **/
    public class BusFactory implements CarFactory{
        @Override
        public Car getCar() {
            return new Bus();
        }
    }
    
    package com.duchong.factorymodel;
    
    /**
     * @author DUCHONG
     * @since 2018-03-29 14:09
     **/
    public class TaxiFactory implements CarFactory{
        @Override
        public Car getCar() {
            return new Taxi();
        }
    }
    

      调用者,这里用main方法代替

    package com.duchong.factorymodel;
    
    /**
     * @author DUCHONG
     * @since 2018-03-29 14:09
     **/
    public class Main {
        public static void main(String[] args) {
            CarFactory factory=null;
    
            factory=new BusFactory();
            Car bus=factory.getCar();
            bus.move();
    
            factory=new TaxiFactory();
            Car taxi=factory.getCar();
            taxi.move();
        }
    }
    

      运行结果

  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/geekdc/p/8669643.html
Copyright © 2011-2022 走看看