设计模式在之前学习过,但是因为对于代码还不够熟悉,对于UML图的理解也不是很到位,而且UML图应用到代码中也是稀里糊涂的,所以应用时还需要再次学习设计模式。

上篇博客概念和UML图分析比较多,这次主要就是在代码上的实现

简单工厂

例子:一个人要去餐馆可以吃饭喝饮料,餐馆就是做要创建对象的父类,米饭、饮料就是具体子类对象,简单工厂模式是核心,通过它来创建实例。UML图如下:    

java 工厂模式生成对象 java编写简单的工厂模型_工厂方法

Restaurant:创建实例的父类或接口

/*
 * 所有实例公共接口或父类
 */
public abstract class Restaurant {
	public abstract void doing();
}

Eat和Drink:Restaurant的具体实现类

/*
 * 创建的具体子类
 */
public class Eat extends Restaurant{
	@Override
	public void doing() {
		System.out.println("吃米饭");
	}
}

public class Drink extends Restaurant{
	@Override
	public void doing() {
		System.out.println("喝饮料");
	}
}

简单工厂:创建所有实例的内部逻辑

/*
 * 简单工厂:根据传入参数创建具体子类实现类
 */
public class SimpleFactory {
	public Restaurant createRestaurant(String type){
		switch(type){
		case "吃":
			return new Eat();
		case "喝":
			return new Drink();
		default:
			break;
		}
		return null;
	}
}

Demo:创建实例,调用方法

public class demo {
	public static void main(String[] args) {
		//创建简单工厂对象
		SimpleFactory simpleFactory=new SimpleFactory();
		//调用工厂对象中的方法并传参"吃",返回为Restaurant对象
		Restaurant createRestaurant = simpleFactory.createRestaurant("吃");
		//Restaurant对象调用本身方法
		createRestaurant.doing();
	}
}

控制台上输出:


  

java 工厂模式生成对象 java编写简单的工厂模型_工厂方法_02

由此我们可以看到简单工厂就是解耦合的,动态的实例化不同的对象,但是当需要一个新实现类时,需要修改工厂中的内容,这个符合我们的开放-封闭原则。于是引出工厂方法模式。

工厂方法

java 工厂模式生成对象 java编写简单的工厂模型_java 工厂模式生成对象_03

FactoryMethod:定义工厂抽象类

/*
 * 定义抽象工厂
 */
public abstract class FactoryMethod {
	public abstract Restaurant createRestaurant();
}

EatFactory、DrinkFactory:定义具体工厂方法

/*
 * EatFactory:定义具体工厂方法
 */
public class EatFactory extends FactoryMethod {
	@Override
	public Restaurant createRestaurant() {
		return new Eat() ;
	}
}

/*
 * DrinkFactory:定义具体工厂方法
 */
public class DrinkFactory extends FactoryMethod{
	@Override
	public Restaurant createRestaurant() {
		return new Drink();
	}
}

Demo:应用多态,创建实例,调用方法

public class demo {
	public static void main(String[] args) {
		//多态:创建EatFactory()对象
		FactoryMethod eatFactory = new EatFactory();
		//多态:EatFactory调用方法创建Restaurant对象
		Restaurant createRestaurant = eatFactory.createRestaurant();
		//具体实现类调用方法
		createRestaurant.doing();
	}
}

控制台显示:


   

java 工厂模式生成对象 java编写简单的工厂模型_工厂方法_02

由此可知工厂模式当需要增加如:唱歌时,可以直接增加一个唱歌工厂和一个唱歌实现类,这样就满足了工厂的开放封闭原则。

工厂方法其实就是简单工厂的升级版本的,让接口依赖接口,抽象类依赖于抽象类,所有实现类的实现都是由具体工厂去创建对象,调用方法实现。最后还是得多实践。