zoukankan      html  css  js  c++  java
  • 设计模式——工厂方法模式

    定义: 

    工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作交给子类去完成。也就是后所这个核心工厂仅仅只是提供创建的接口,具体实现方法交给继承它的子类去完成。当我们的系统需要增加其他新的对象时,我们只需要添加一个具体的产品和它的创建工厂即可,不需要对原工厂进行任何修改,这样很好地符合了“开闭原则”。

    示例代码:

    Fruit.java

    package com.designPattern.factoryMethod;
    
    /***
     * 
     * @author liuzhihu
     *
     */
    public interface Fruit {
    
    	/***
    	 * 定义吃水果的方法
    	 */
    	public void eatFruit();
    
    }
    

    Apple.java

    package com.designPattern.factoryMethod;
    
    /***
     * 
     * @author liuzhihu
     *
     */
    public class Apple implements Fruit {
    
    	@Override
    	public void eatFruit() {
    
    		System.out.println("吃苹果  ......");
    
    	}
    
    }
    

    Banana.java

    package com.designPattern.factoryMethod;
    
    /***
     * 
     * @author liuzhihu
     *
     */
    public class Banana implements Fruit {
    
    	@Override
    	public void eatFruit() {
    
    		System.out.println("吃香蕉 ......");
    
    	}
    
    }
    

      

    FruitFactory.java

    package com.designPattern.factoryMethod;
    
    public abstract class FruitFactory {
    
    	/***
    	 * 采集水果
    	 * 
    	 * @param type
    	 * @return
    	 */
    	public abstract Fruit getFruit();
    
    }
    

      

    AppleFactory.java

    package com.designPattern.factoryMethod;
    
    public class AppleFactory extends FruitFactory {
    
    	@Override
    	public Fruit getFruit() {
    
    		System.out.println("采摘苹果");
    
    		return new Apple();
    
    	}
    }
    

      

    BananaFactory.java

    package com.designPattern.factoryMethod;
    
    public class BananaFactory extends FruitFactory {
    
    	@Override
    	public Fruit getFruit() {
    
    		System.out.println("采摘香蕉");
    
    		return new Banana();
    
    	}
    }
    

     

    MainTest.java

    package com.designPattern.factoryMethod;
    
    /***
     * 工厂方法模式
     * 
     * @author liuzhihu
     *
     */
    public class MainTest {
    
    	public static void main(String[] args)
    			throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    
    		AppleFactory appleFactory = new AppleFactory();
    
    		Fruit apple = appleFactory.getFruit();
    
    		apple.eatFruit();
    
    		BananaFactory bananaFactory = new BananaFactory();
    
    		Fruit banana = bananaFactory.getFruit();
    
    		banana.eatFruit();
    
    	}
    
    }
    

      

    以上代码,如果想要再添加一种水果,那么实现一下Fruit.java与FruitFactory.java 即可,不用再重新修改旧的代码!

      

    优点

               1、  在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。

               2、  在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。

     缺点

               1、  每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

      

     

  • 相关阅读:
    一道360 crackme的详细分析
    Unity 3d游戏逆向之.NET Reflector工具使用介绍
    如何获取系统Home(Launcher)应用判断用户是否处于home界面
    IDA Pro反编译代码类型转换参考
    Spring揭秘笔记
    Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quick
    Oracle修改密码后,登录sys或者sysdba时一直提示:ORA-01017: invalid username/password; logon denied
    Springboot项目中调用Controller方法出现:java.lang.IllegalArgumentException: Unknown return value type: java.lang.Boolean
    在idea中导入Gradle项目的一些记录
    IDEA修改项目的JDK版本
  • 原文地址:https://www.cnblogs.com/liuzhihu/p/8243561.html
Copyright © 2011-2022 走看看