Factory工厂设计模式

定义

任何可以产生对象的方法或类,都可以称之为工厂

单例也是一种工厂

为什么有了new之后,还要有工厂?

  • 灵活控制生产过程
  • 权限、修饰、日志…

不使用工厂模式

package com.company;

interface IFood{ //定义一个食物标准
    public void eat(); //吃
}
class Bread implements IFood{
    @Override
    public void eat() {
        System.out.println("吃面包。");
    }
}
class Milk implements IFood{
    @Override
    public void eat() {
        System.out.println("喝牛奶。");
    }
}
//接口、抽象类
public class Main {

    public static void main(String[] args) {
        IFood food = new Bread();
        food.eat();
        IFood milk = new Milk();
        milk.eat();
    }
}

此时的程序出现有耦合的问题,而造成耦合最直接的元凶:“关键字new”。良好的设计应该避免耦合。

使用工厂模式

静态工厂

package com.company;

interface IFood{ //定义一个食物标准
    public void eat(); //吃
}
class Bread implements IFood{
    @Override
    public void eat() {
        System.out.println("吃面包。");
    }
}
class Milk implements IFood{
    @Override
    public void eat() {
        System.out.println("喝牛奶。");
    }
}
class Factory{
    public static IFood getInstance(String className) {
        if("bread".equals(className)){
            return new Bread();
        }else if("milk".equals(className)){
            return new Milk();
        }else{
            return null;
        }
    }
}
//接口、抽象类
public class Main {

    public static void main(String[] args) {
        IFood food = Factory.getInstance("milk");
        if(food != null) food.eat();
    }
}

动态工厂(通过反射)

package newinstance;

interface IFood{ //定义一个食物标准
    public void eat(); //吃
}
class Bread implements IFood{
    @Override
    public void eat() {
        System.out.println("吃面包。");
    }
}
class Milk implements IFood{
    @Override
    public void eat() {
        System.out.println("喝牛奶。");
    }
}
class Factory{
    public static IFood getInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    	IFood iFood = null;
    	Class<?> cls = Class.forName(className);
    	iFood  = (IFood)cls.newInstance();
		return iFood;
    }
}
//接口、抽象类
public class JavaAPIDemo2 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        IFood food = Factory.getInstance("newinstance.Milk");
        if(food != null) food.eat();
    }
}

使用泛型改造动态工厂

此时的工厂设计模式不再受限于指定的接口,可以为所有接口提供服务

package newinstance;

interface IFood{ //定义一个食物标准
    public void eat(); //吃
}

class Bread implements IFood{
    @Override
    public void eat() {
        System.out.println("吃面包。");
    }
}

class Milk implements IFood{
    @Override
    public void eat() {
        System.out.println("喝牛奶。");
    }
}

class Factory{
    @SuppressWarnings("unchecked")
	public static <T> T getInstance(String className, Class<T> clazz) throws Exception {
      T instance = (T) Class.forName(className).getDeclaredConstructor().newInstance();
      return instance;
   }
}

public class JavaAPIDemo2 {

    public static void main(String[] args) throws Exception {
		IFood milk = Factory.getInstance("newinstance.Milk", Milk.class);
        if (milk != null) {
            milk.eat();
        }
        IFood bread = Factory.getInstance("newinstance.Bread", Bread.class);
        if (bread != null) {
            bread.eat();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值