1、工厂模式的作用和目的:
降低代码的耦合性,并提高代码的复用率。在一个很大的项目中假如很多地方都要用到类A,那么要new很多次A,一旦类A的需求 改变,那么就要修改很多地方。不仅耗时费力而且在修改的过程中极易因修改代码而产生bug。如果利用工厂模式的话不仅可以提高 代码的复用率,而且当需要修改代码时,只需要对工厂类和具体的实现类进行少量修改即可。
设计需求:消费链由产品--工厂--消费者三部分,现在消费者需要不同的食物。
分析需求:产品类提供不同的食物原材料,工厂类生产食物,消费者通过工厂类直接获取食物;
接下来分别用简单工厂模式、工厂方法模式和抽象工厂模式进行实现。
2、简单工厂模式:
产品类:
/*
* 简单工厂模式:这是产品的接口
*
*/
public interface Food {
public void foodName();
}
/*
* 具体的产品:这是面包
*
*/
public class Apple implements Food {
@Override
public void foodName() {
System.out.println("----我是苹果-----");
}
}
/*
* 具体的产品:这是面包
*
*/
public class Bread implements Food {
@Override
public void foodName() {
System.out.println("----我是面包-----");
}
}
工厂类:
/*
* 工厂类:这是生产者
*
*/
public class Factory {
public static Food getFood(String foodName) {
Food food = null;
if ("bread".equals(foodName)) {
food = new Bread();
} else if ("apple".equals(foodName)) {
food = new Apple();
}
return food;
}
}
消费者类:
/*
* 这是消费者类:这是消费者
*
*/
public class Consumer {
public static void main(String[] args) {
System.out.println("这是简单工厂模式:");
// 我想吃面包
Food bread = Factory.getFood("bread");
bread.foodName();
// 我想吃苹果
Food apple = Factory.getFood("apple");
apple.foodName();
}
}
输出结果:
3、工厂方法模式:
产品类:
/*
* 简单工厂模式:这是产品的接口
*
*/
public interface Food {
public void foodName();
}
/*
* 具体的产品:这是面包
*
*/
public class Apple implements Food {
@Override
public void foodName() {
System.out.println("----我是苹果-----");
}
}
/*
* 具体的产品:这是面包
*
*/
public class Bread implements Food {
@Override
public void foodName() {
System.out.println("----我是面包-----");
}
}
工厂类:
/*
* 这是工厂接口:
*
*/
public interface Factory {
public Food getFood();
}
/*
* 这是工厂类的具体实现:这是苹果工厂
*
*/
public class AppleFactory implements Factory{
@Override
public Food getFood() {
return new Apple();
}
}
/*
* 这是工厂类的具体实现:这是面包工厂
*
*/
public class BreadFactory implements Factory{
@Override
public Food getFood() {
return new Bread();
}
}
消费者类:
/*
* 这是消费者类:这是消费者
*
*/
public class Consumer {
public static void main(String[] args) {
System.out.println("这是工厂方法模式:");
// 我想吃面包
Factory breadFactory=new BreadFactory();
Food bread = breadFactory.getFood();
bread.foodName();
// 我想吃苹果
Factory appleFactory=new AppleFactory();
Food apple = appleFactory.getFood();
apple.foodName();
}
}
消费者类:
4、抽象工厂方法:
增加需求:现在消费者需要食物的同时还需要饮料。
产品类:
/*
* 简单工厂模式:这是食物的接口
*
*/
public interface Food {
public void foodName();
}
/*
* 具体的产品:这是面包
*
*/
public class Apple implements Food {
@Override
public void foodName() {
System.out.println("----我是苹果-----");
}
}
/*
* 具体的产品:这是面包
*
*/
public class Bread implements Food {
@Override
public void foodName() {
System.out.println("----我是面包-----");
}
}
/*
* 抽象工厂模式:这是饮料的接口
*
*/
public interface Drink {
public void drinkName();
}
/*
*具体的产品:这是咖啡
*
*/
public class Coffee implements Drink {
@Override
public void drinkName() {
System.out.println("----我是咖啡----");
}
}
/*
*具体的产品:这是水
*
*/
public class Water implements Drink {
@Override
public void drinkName() {
System.out.println("----我是矿泉水----");
}
}
工厂类:
/*
* 这是工厂接口:
*
*/
public interface Factory {
// 获取食物
public Food getFood();
// 获取饮料
public Drink getDrink();
}
/*
* 这是工厂类的具体实现:这是苹果咖啡工厂
*
*/
public class AppleCoffeeFactory implements Factory{
@Override
public Food getFood() {
return new Apple();
}
@Override
public Drink getDrink() {
return new Coffee();
}
}
/*
* 这是工厂类的具体实现:这是面包水工厂
*
*/
public class BreadWaterFactory implements Factory{
@Override
public Food getFood() {
return new Bread();
}
@Override
public Drink getDrink() {
return new Water();
}
}
消费者类:
/*
* 这是消费者类:这是消费者
*
*/
public class Consumer {
public static void main(String[] args) {
System.out.println("这是抽象工厂模式:");
// 我想吃面包喝水
BreadWaterFactory readWaterFactory=new BreadWaterFactory();
Food bread = readWaterFactory.getFood();
Drink water=readWaterFactory.getDrink();
bread.foodName();
water.drinkName();
// 我想吃苹果喝咖啡
AppleCoffeeFactory appleCoffeeFactory=new AppleCoffeeFactory();
Food apple = appleCoffeeFactory.getFood();
Drink coffe=appleCoffeeFactory.getDrink();
apple.foodName();
coffe.drinkName();
}
}
输出结果: