zoukankan      html  css  js  c++  java
  • 设计模式(2):工厂方法模式

    工厂方法模式:

     

    定义:

     

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。

    工厂方法使用一个类的实例化延迟到子类。

     

    举个栗子:我们要生产水果罐头,我们应该怎么做呢?

    首先,我们须要准备好原料。其次我们须要一个罐头工厂,往工厂里运送不同的原料,出来的就是不同的罐头。

     

    原料就是苹果啊、橘子啊等等的这些类。

     

    interface IFruits {
    	public void taste();
    }
    
    class Apple implements IFruits {
    
    	public void taste() {
    		System.out.println("I'm apple");
    	}
    }
    
    class Orange implements IFruits {
    
    	public void taste() {
    		System.out.println("I'm orange");
    	}
    }


     

    工厂呢就是可以生产水果罐头的工厂啊。

     

    abstract class AbstractFactory {
    	// 採用泛型对输入參数进行限制:
    	// 1.必须是Class类型
    	// 2.必须是IFruits类型的子类
    	public abstract <T extends IFruits> T createCan(Class<T> c);
    }
    
    class Factory extends AbstractFactory {
    
    
    	@Override
    	public <T extends IFruits> T createCan(Class<T> c) {
    		IFruits fruits = null;
    
    		try {
    			fruits = (IFruits) Class.forName(c.getName()).newInstance();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return (T) fruits;
    	}
    
    }


     

    场景类:

     

    public class Client {
    
    	public static void main(String[] args) {
    		AbstractFactory factory = new Factory();
    		IFruits apple = factory.createCan(Apple.class);
    		apple.taste();
    		IFruits orange = factory.createCan(Orange.class);
    		orange.taste();
    	}
    }

     

     

    书中的样例:女娲造人,产生各种肤色的人。

     

    package ne;
    
    interface Human {
    	public void say();
    }
    
    class Black_human implements Human {
    
    	public void say() {
    		System.out.println("I'm black");
    	}
    }
    
    class Yellow_human implements Human {
    
    	public void say() {
    		System.out.println("I'm yellow");
    	}
    
    }
    
    abstract class AbstractFactory {
    	public abstract <T extends Human> T createHuman(Class<T> c);
    }
    
    class Factory extends AbstractFactory {
    
    	@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 class Client {
    	public static void main(String[] args) {
    		AbstractFactory factory = new Factory();
    		Human black_human = factory.createHuman(Black_human.class);
    		Human yellow_human = factory.createHuman(Yellow_human.class);
    		black_human.say();
    		yellow_human.say();
    	}
    }
    


     

     

     


     

  • 相关阅读:
    vue中插槽的理解
    父子组件的通信
    vue3.0怎么禁用eslint校验代码和修改端口号
    三大排序
    让机器人实现自主行走 没你想的那么难
    国内外知名激光雷达公司盘点
    激光雷达寿命短,思岚通过什么技术来解决?
    浅谈SLAM的回环检测技术
    除了ROS, 机器人定位导航还有其他方案吗?
    思岚科技即将登陆“2018日本机器人周”精彩抢先看
  • 原文地址:https://www.cnblogs.com/llguanli/p/8449577.html
Copyright © 2011-2022 走看看