zoukankan      html  css  js  c++  java
  • 设计模式——抽象工厂模式

    定义:

     抽象工厂模式提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

     抽象工厂允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。

    示例代码:

    Fruit.java

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

      

    Apple.java

    package com.designPattern.abstractFactory;
    
    /***
     * 
     * @author liuzhihu
     *
     */
    public abstract class Apple implements Fruit {
    
    	public abstract void eatFruit();
    }
    

     

    Banana.java

    package com.designPattern.abstractFactory;
    
    /***
     * 
     * @author liuzhihu
     *
     */
    public abstract class Banana implements Fruit {
    
    	public abstract void eatFruit();
    }
    

      

    NorthApple.java

    package com.designPattern.abstractFactory;
    
    public class NorthApple extends Apple {
    
    	@Override
    	public void eatFruit() {
    		
    		System.out.println("吃北方苹果。。。。。。");
    
    	}
    
    }
    

    NorthBanana.java

    package com.designPattern.abstractFactory;
    
    public class NorthBanana extends Banana {
    
    	@Override
    	public void eatFruit() {
    
    		System.out.println("吃北方香蕉。。。。。。");
    
    	}
    
    }
    

    SouthApple.java

    package com.designPattern.abstractFactory;
    
    public class SouthApple extends Apple {
    
    	@Override
    	public void eatFruit() {
    
    		System.out.println("吃南方苹果。。。。。。");
    
    	}
    
    }
    

     

    SouthBanana.java

    package com.designPattern.abstractFactory;
    
    public class SouthBanana extends Banana {
    
    	@Override
    	public void eatFruit() {
    
    		System.out.println("吃南方香蕉。。。。。。");
    
    	}
    
    }
    

      

    FruitFactory.java

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

      

    NorthFruitFactory.java

    package com.designPattern.abstractFactory;
    
    public class NorthFruitFactory extends FruitFactory {
    
    	@Override
    	public Fruit getFruit(String type) {
    
    		if ("Apple".equals(type)) {
    
    			return new NorthApple();
    
    		} else if ("Banana".equals(type)) {
    
    			return new NorthBanana();
    
    		} else {
    
    			System.out.println("找不到对应的水果......");
    
    			return null;
    		}
    
    	}
    
    }
    

      

    SouthFruitFactory.java

    package com.designPattern.abstractFactory;
    
    public class SouthFruitFactory extends FruitFactory {
    
    	@Override
    	public Fruit getFruit(String type) {
    
    		if ("Apple".equals(type)) {
    
    			return new SouthApple();
    
    		} else if ("Banana".equals(type)) {
    
    			return new SouthBanana();
    
    		} else {
    
    			System.out.println("找不到对应的水果......");
    
    			return null;
    		}
    
    	}
    
    }
    

      

    MainTest.java

    package com.designPattern.abstractFactory;
    
    public class MainTest {
    
    	public static void main(String[] args) {
    
    		// 北方水果
    		NorthFruitFactory northFruitFactory = new NorthFruitFactory();
    
    		Fruit northApple = northFruitFactory.getFruit("Apple");
    
    		northApple.eatFruit();
    
    		Fruit northBanana = northFruitFactory.getFruit("Banana");
    
    		northBanana.eatFruit();
    
    		// 南方水果
    		SouthFruitFactory southFruitFactory = new SouthFruitFactory();
    
    		Fruit southApple = southFruitFactory.getFruit("Apple");
    
    		southApple.eatFruit();
    
    		Fruit southBanana = southFruitFactory.getFruit("Banana");
    
    		southBanana.eatFruit();
    
    	}
    
    }
    

      

    优点

               1、  抽象工厂隔离了具体类的生成,是的客户端不需要知道什么被创建。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

               2、  当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

     缺点

               添加新的行为时比较麻烦。如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

     

  • 相关阅读:
    圆形刻度盘 进度 展示
    弧度、角度换算公式
    placeholder 颜色更改
    移除HTML5 input在type="number"时的上下小箭头
    linux 安装python-setuptools
    通过helm 安装 harbor 不成功问题处理
    k8s 添加ingress 暴露服务
    k8s编辑pod配置信息
    postgres 数据导入导出
    万能视频后台转码
  • 原文地址:https://www.cnblogs.com/liuzhihu/p/8249649.html
Copyright © 2011-2022 走看看