zoukankan      html  css  js  c++  java
  • java 工厂的变形模拟的各种应用

     工厂模式是在项目开发中使用效率高,意一个接口,该定义用于创建对象。让子类来决定哪一个类实例。

    这就是一个工厂类的示意图

    接着来一个简单的样例:

    如上图所看到的,我们首先定义我们的产品抽象类接口,也能够是抽象类:

    package factory;
    
    public abstract class PlatForm {
    	public void search(){
    		System.out.println("你搜索的结果是。。。

    。。。

    "); } public abstract void music(); }


    以下是一些实现类

    package factory;
    
    public class BaiduProduct extends PlatForm{
    
    	@Override
    	public void music() {
    		System.out.println("baidu music");
    	}
    
    }
    

    package factory;
    
    public class Qihu360Product extends PlatForm{
    
    	@Override
    	public void music() {
    		System.out.println("360 music");
    	}
    
    }
    

    package factory;
    
    public class SogouProduct extends PlatForm{
    
    	@Override
    	public void music() {
    		System.out.println("sogou music");
    	}
    
    }
    

    三个实现类已经完毕,以下我们要来一个工厂的抽象类
    package factory;
    
    public abstract class Creator {
    	/**
    	 * 创建一个产品对象,当中T 能够为 String Enum Class等  參数能够自己设置
    	 * @param c
    	 * @return
    	 */
    	public abstract <T extends PlatForm> T createProduct(Class<T> c);
    }
    
    以下是实现类

    package factory;
    
    public class ConcrentCreator extends Creator{
    
    	@Override
    	public <T extends PlatForm> T createProduct(Class<T> c) {
    		PlatForm plat = null;
    		try {
    			/**
    			 * 创建一个用于创建对象的接口,让子类去确定实例化哪一个对象。工厂方法,让一个类的实例化延迟到子类
    			 */
    			plat = (PlatForm) Class.forName(c.getName()).newInstance();
    		} catch (InstantiationException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    		return (T) plat;
    	}
    
    }
    

    package factory;
    
    public class Client {
    	public static void main(String[] args) {
    		Creator creator = new ConcrentCreator();
    		//在这里能够把你要实例化的类给传进去。然后就可以调用你想要的方法。

    PlatForm plat = creator.createProduct(BaiduProduct.class); plat.search(); plat.music(); } }


    在这里面模仿了一个client,就能够输出你想要的结果。

    在工厂模式方法中抽象产品类负责定义产品的共性,实现实物最抽象的定义;creator为产品抽喜创建类,也就是抽象工厂详细怎样创建产品类有详细的实现creator的工厂类来完毕。工厂类的变种非常多,以下,我总结类一个比較通用的源代码。

    1:抽象产品类

    package factory.total;
    
    public abstract class Product {
    	public void method1(){
    		//全部产品的共性
    	}
    	//抽象方法   详细有继承它的类去实现
    	public abstract void method2();
    }
    
    2:产品实现类

    package factory.total;
    
    public class ConcretProduct1 extends Product{
    
    	@Override
    	public void method2() {
    		//TODO
    	}
    
    }
    
    package factory.total;
    
    public class ConcretProduct2 extends Product{
    
    	@Override
    	public void method2() {
    		//TODO
    	}
    
    }
    

    3:抽象工厂类

    package factory.total;
    
    public abstract class Creator {
    	public abstract <T extends Product> T createMethod(Class<T> c);
    		
    }
    

    4:详细工厂类:

    package factory.total;
    
    public class ConcreteCreator extends Creator{
    
    	@Override
    	public <T extends Product> T createMethod(Class<T> c) {
    		Product pro = null;
    		try {
    			pro = (Product) Class.forName(c.getName()).newInstance();
    		} catch (InstantiationException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    		return (T) pro;
    	}
    
    }
    

    场景模拟类

    package factory.total;
    
    public class Client {
    	public static void main(String[] args) {
    		Creator creator = new ConcreteCreator();
    		Product pro = creator.createMethod(ConcretProduct1.class);
    		pro.method1();
    		pro.method2();
    	}
    }
    

    当中工厂模式又分为简单工厂模式,和多级工厂模式,只是这两种情况。和上一种都比較类似了,当中简单工厂模式仅仅是简单的把抽象工厂类去掉,然后把工厂实现类的方法改成static方法。多级工厂模式是指:比如当我们见到一个比較复杂的项目时。全部的产品类都放到一个工厂类中去初始化会显得结构不清晰,那么我们如今就为每一种产品都有自己的一个工厂类;以下我会给出实例多级工厂类的应用。

    我是有些基础类还是使用曾经的。仅仅只是为每一个产品添加了一个工厂类

    1:抽象工厂类:

    package factory.more;
    
    public abstract class AbstractPlatFactory {
    	public abstract PlatForm createPlat();
    }
    

    2:详细工厂类:

    package factory.more;
    
    public class BaiduFactory extends AbstractPlatFactory{
    
    	@Override
    	public PlatForm createPlat() {
    		// TODO Auto-generated method stub
    		return new BaiduProduct();
    	}
    
    }
    

    package factory.more;
    
    public class Qihu360Factory extends AbstractPlatFactory{
    
    	@Override
    	public PlatForm createPlat() {
    		return new Qihu360Product();
    	}
    
    }
    

    package factory.more;
    
    public class SogouFactory extends AbstractPlatFactory{
    
    	@Override
    	public PlatForm createPlat() {
    		return new SogouProduct();
    	}
    
    }
    

    场景类:
    package factory.more;
    
    public class Client {
    	public static void main(String[] args) {
    		 PlatForm plat = new BaiduFactory().createPlat();
    		 plat.search();
    		 plat.music();
    	}
    }
    
    这是多级工厂类的使用,

    实际上还有抽象工厂类的应用,它是指为相关对象提供一组接口,如果没有指定具体的类。

    (今天太晚了,过了一段时间,然后会说)

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    TP框架对数据库的操作
    Nginx的安装及配置
    微信小程序的入门
    MySQL的多表联查
    Larave中CSRF攻击
    Linux(三)
    Linux(二)
    Linux(一)
    安全测试检查项
    mysql-视图及索引简介
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4793571.html
Copyright © 2011-2022 走看看