• Java设计模式之三(抽象工厂模式)


    一、什么是抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。


    二、产品族和产品等级结构


    三、模式中包含的角色及其职责

    1.抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。

    2.具体工厂( Concrete  Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。

    3.抽象(Product)角色 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    4.具体产品(Concrete Product)角色 抽象模式所创建的具体实例对象


    总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。


    代码实现:

    抽象Fruit(水果)类:

    package com.qianyan.product;
    
    public interface Fruit {
    
    	/**
    	 * 采集
    	 */
    	public void get();
    }
    


    抽象产品结构类(苹果、香蕉):

    package com.qianyan.bean;
    
    import com.qianyan.product.Fruit;
    
    public abstract class Apple implements Fruit{
    
    	/**
    	 * 采集
    	 */
    	public abstract void get();
    }
    
    package com.qianyan.bean;
    
    import com.qianyan.product.Fruit;
    
    public abstract class Banana implements Fruit{
    
    	/**
    	 * 采集
    	 */
    	public abstract void get();
    }
    


    抽象产品类的实现:产品族(北方苹果、香蕉;南方苹果、香蕉):

    package com.qianyan.bean.impl;
    
    import com.qianyan.bean.Apple;
    
    public class NorthApple extends Apple{
    
    	@Override
    	public void get() {
    		System.out.println("生产北方苹果!");
    	}
    	
    }
    
    package com.qianyan.bean.impl;
    
    import com.qianyan.bean.Banana;
    
    public class NorthBanana extends Banana{
    
    	@Override
    	public void get() {
    		System.out.println("生产北方香蕉!");
    	}
    
    }
    
    package com.qianyan.bean.impl;
    
    import com.qianyan.bean.Apple;
    
    public class SourthApple extends Apple{
    
    	@Override
    	public void get() {
    		System.out.println("生产南方苹果!");
    	}
    
    }
    
    package com.qianyan.bean.impl;
    
    import com.qianyan.bean.Banana;
    
    public class SourthBanana extends Banana{
    
    	@Override
    	public void get() {
    		System.out.println("生产南方香蕉!");
    	}
    
    }
    


    抽象工厂类(对应产品结构类):

    package com.qianyan.factory;
    
    import com.qianyan.product.Fruit;
    
    /**
     * 抽象工厂类
     * @author hadoop
     *
     */
    public interface FruitFactory {
    	
    	//获取苹果
    	public Fruit getApple();
    	
    	//获取香蕉
    	public Fruit getBanana();
    }
    


    抽象工厂的实现类(对应产品族):

    package com.qianyan.factory.impl;
    
    import com.qianyan.bean.impl.NorthApple;
    import com.qianyan.bean.impl.NorthBanana;
    import com.qianyan.factory.FruitFactory;
    import com.qianyan.product.Fruit;
    
    public class NorthFactory implements FruitFactory{
    
    	@Override
    	public Fruit getApple() {
    		return new NorthApple();
    	}
    
    	@Override
    	public Fruit getBanana() {
    		return new NorthBanana();
    	}
    
    
    }
    
    package com.qianyan.factory.impl;
    
    import com.qianyan.bean.impl.SourthApple;
    import com.qianyan.bean.impl.SourthBanana;
    import com.qianyan.factory.FruitFactory;
    import com.qianyan.product.Fruit;
    
    public class SourthFactory implements FruitFactory{
    
    	@Override
    	public Fruit getApple() {
    		return new SourthApple();
    	}
    
    	@Override
    	public Fruit getBanana() {
    		return new SourthBanana();
    	}
    
    
    }
    


    顾客类:

    package com.qianyan.user;
    
    import com.qianyan.factory.impl.NorthFactory;
    import com.qianyan.factory.impl.SourthFactory;
    import com.qianyan.product.Fruit;
    
    public class Customer {
    
    	public static void main(String[] args) throws Exception {
    		//获得北方生产链
    		NorthFactory f1 = new NorthFactory();
    		
    		//通过NorthFactory来获取北方Apple实例对象
    		Fruit northApple = f1.getApple();
    		northApple.get();
    		
    		//通过NorthFactory来获取北方Banana实例对象
    		Fruit northBanana = f1.getBanana();
    		northBanana.get();
    		
    		//获得南方生产链
    		SourthFactory f2 = new SourthFactory();
    		
    		//通过SourthFactory来获取南方Apple实例对象
    		Fruit sourthApple = f2.getApple();
    		sourthApple.get();
    		
    		//通过SourthFactory来获取南方Banana实力对象
    		Fruit sourthBanana = f2.getBanana();
    		sourthBanana.get();
    	}
    }
    



  • 相关阅读:
    Date
    Math
    封装实参的对象 arguments
    函数方法call()和apply()
    执行上下文栈
    原型(prototype属性)和原型链。 重要!!!
    android studio for Mac快捷键大全
    软件的横竖屏切换
    Android XML文件中@id和@+id的区别
    java中的Iterator<E>
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3019997.html
Copyright © 2020-2023  润新知