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

    学过spring和hibernate的应该都知道,这个模式在这俩框架里面被用的淋漓尽致,可以说看懂了spring和hibernate那么你会觉得new一个对象什么的简直是个low B。工厂方法的核心思想就是让别人去给我实例化对象,我只要你拿来给我用就行了,我作为调用者我就是牛逼 我管你实例化干了哪些事呢,我都不关心我只关心我用的爽不爽!那么这个专门用来实例化对象的东西就可以称之为工厂,由工厂生产对象~~~

    具体看看工厂模式最佳实践:(现在满大街都在提倡什么面向接口编程,我就是要用抽象类!你咬我啊~~)

    先规范化一个工厂规定工厂能干哪些事情,嗯,我们这个工厂是用来造人的!(这个相当于集团控股总部,不干事只出规章制度):

    public abstract class AbstactHumanFactory
    {
    	public abstract <T extends Human> T createHuman(Class<T> c);
    }
    

    这个是真正的工厂了用来造人!那么具体要造什么人呢?我也不知道,我只知道我要造人类,你只要告诉我要造一个什么样的人类我就还你一个大活人。在java中就是通过类加载器实现的。(关于类加载器戳这→_→:http://blog.csdn.net/yanwushu/article/details/7574713)

    public class HumanFactory extends AbstactHumanFactory
    {
    
    	@Override
    	public <T extends Human> T createHuman(Class<T> c)
    	{
    		Human human = null;
    		try
    		{
    			human = (Human) Class.forName(c.getName()).newInstance();
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    
    		return (T) human;
    	}
    }

    那么我怎么向你描述我要一个什么样的人呢?我总不能说:喂!内谁,给我造一个美女!这个是不现实的,工厂哪知道什么是美女。。。因此我们只能事先定义一个模版,把这个模版拿给工厂让他去批量生产人类,下面都是模版:

    public interface Human
    {
    	public void getColor();
    	public void talk();
    }
    
    public class WhiteMan implements Human
    {
    
    	@Override
    	public void getColor()
    	{
    		System.out.println("White");
    	}
    
    	@Override
    	public void talk()
    	{
    		System.out.println("WhiteMan");
    	}
    
    }
    public class BlackMan implements Human
    {
    
    	@Override
    	public void getColor()
    	{
    		System.out.println("Black");
    	}
    
    	@Override
    	public void talk()
    	{
    		System.out.println("BlackMan");
    	}
    
    }
    public class YelloMan implements Human
    {
    
    	@Override
    	public void getColor()
    	{
    		System.out.println("Yello");
    	}
    
    	@Override
    	public void talk()
    	{
    		System.out.println("YelloMan");
    	}
    
    }


    OK,模版定义完成,下面我们就来造人了!

    public class Test
    {
    	public static void main(String[] args)
    	{
    		AbstactHumanFactory factory=new HumanFactory();
    		System.out.println("--create white man--");
    		Human whiteMan = factory.createHuman(WhiteMan.class);
    		whiteMan.getColor();
    		whiteMan.talk();
    		
    		System.out.println("--create black man--");
    		Human blackMan=factory.createHuman(BlackMan.class);
    		blackMan.getColor();
    		blackMan.talk();
    		
    		System.out.println("--create yellow man--");
    		Human yellowMan=factory.createHuman(YelloMan.class);
    		yellowMan.getColor();
    		yellowMan.talk();
    	}
    
    }






  • 相关阅读:
    [Linux/wine.笔记]关于WINE(Linux上运行Windows程序的兼容层)
    [docker.笔记]常用命令
    [技巧.DotNet]超级好用的动态对象ExpandoObject
    .net core 的窗体设计器进展(.NET Core Windows Forms designer),5月中旬或将发布成熟版!
    [问题记录.Oracle/odp.net]托管ODP中,连接池的连接验证参数(validate connection=true)无效?
    [JWT]Json Web Token 备忘
    [MQ]RabbitMQ的概要介绍及消息路由规则
    常见排序算法
    C语言数值存储溢出探讨
    从计算理解数组
  • 原文地址:https://www.cnblogs.com/xmc0551/p/5645576.html
Copyright © 2011-2022 走看看