工厂方法模式

应用最广泛的模式–> 工厂方法模式
工厂方法模式是创建型设计模式之一。
定义:
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景:
任何需要生产复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,
用new 就可以完成创建对象无需使用工厂模式。

工厂方法通用模板

	// 抽线产品类
	public abstract class Product {
	    /**
	     * 产品类的抽象方法
	     */
	    public abstract void method();
	}

	//具体产品A
	class ConcreteProductA extends Product {
	    @Override
	    public void method() {
	        System.out.println("具体产品A");
	    }
	}

	//具体产品B
	class ConcreteProductB extends Product {
	    @Override
	    public void method() {
	        System.out.println("具体产品B");
	    }
	}

	//抽象工厂类
	public abstract class Factory {
	    /**
	     * 抽象工厂方法
	     * 具体生产什么由子类去实现
	     */
	    public abstract Product createProduct();
	}

	//具体工厂
	public class ConcreteFactory extends Factory {

	    @Override
	    public Product createProduct() {
	        return new ConcreteProductA();
	    }
	}

	// 客户类
	public class Client {

	    public static void main(String[] args) {
	    	// 创建工厂
	        Factory factory = new ConcreteFactory();
	        // 通过工厂创建产品
	        Product product = factory.createProduct();
	        // 具体的产品
	        product.method();
	    }
	}

	// 如果我们想创建产品B

	//具体工厂
	public class ConcreteFactory extends Factory {

	    @Override
	    public Product createProduct() {
	//        return new ConcreteProductA();
	        // 创建产品B
	        return new ConcreteProductB();
	    }
	}
	// 多工厂方法模式
	//具体工厂
	public class ConcreteFactoryB extends Factory {
	    @Override
	    public Product createProduct() {
	        return new ConcreteProductB();
	    }
	}
	//具体产品B
	class ConcreteProductB extends Product {
	    @Override
	    public void method() {
	        System.out.println("具体产品B");
	    }
	}
	// 客户类
	public class Client {

	    public static void main(String[] args) {
	        // 创建工厂
	        Factory factoryA = new ConcreteFactoryA();
	        // 通过工厂创建产品
	        Product productA = factoryA.createProduct();
	        // 具体的产品
	        productA.method();

	        // 创建工厂
	        Factory factoryB = new ConcreteFactoryB();
	        // 通过工厂创建产品
	        Product productB = factoryB.createProduct();
	        // 具体的产品
	        productB.method();
	    }
	}

	利用反射更简洁的生产具体产品对象
	//抽象工厂类
	public abstract class Factory {
	    /**
	     * 抽象工厂方法
	     * 具体生产什么由子类去实现
	     *
	     * @param clazz 产品对象类型
	     * @param <T>   具体产品
	     * @return 具体产品对象
	     */
	    public abstract <T extends Product> T createProduct(Class<T> clazz);
	}

	//具体工厂
	public class ConcreteFactory extends Factory {

	    @Override
	    public <T extends Product> T createProduct(Class<T> clazz) {
	        Product product = null;
	        try {
	            product = (Product) Class.forName(clazz.getName()).newInstance();
	        } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
	            e.printStackTrace();
	        }
	        return (T) product;
	    }
	}

	// 客户类
	public class Client {

	    public static void main(String[] args) {
	        // 创建工厂
	        Factory factory = new ConcreteFactory();
	        // 通过工厂创建产品
	        Product product = factory.createProduct(ConcreteProductA.class);
	        // 具体的产品
	        product.method();
	        // 创建工厂
	        Factory factory = new ConcreteFactory();
	        // 通过工厂创建产品
	        Product product = factory.createProduct(ConcreteProductB.class);
	        // 具体的产品
	        product.method();
	    }
	}

	// 静态工厂模式(简单的工厂模式)
	//抽象工厂类
	public class Factory {
	    /**
	     * 抽象工厂方法
	     * 具体生产什么由子类去实现
	     */
	    public static Product createProduct() {
	        return new ConcreteProductB();
	    }
	}


Java 中的工厂方法模式:
	List 和Set 为例,List 和 Set 都继承与 Collection 接口,而Collection
	接口继承于 Iterable接口。
		public interface Iterable<T> {
			/**
		     * Returns an iterator over elements of type {@code T}.
		     *
		     * @return an Iterator.
		     */
		    Iterator<T> iterator();
		}
Android 源码中的工厂方法模式:

	Activity 中的 onCreate(),为不同的Activity 设置不同的View。


优点:
	工厂方法模式是完全符合设计原则的,其降低了对象之间的耦合度,而且
	工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,由
	非常好的扩展性。

缺点:
	每次为工厂方法模式添加新的产品就要编写一个新的产品类,同时还要引入抽象层,必然会导致类结构的复杂化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值