工厂方法模式

 

是不是想先了解一下简单工厂模式呢?他们很像哦!

 

一、是什么

定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

理解:

工厂方法模式是对简单工厂模式的改进,通过引入抽象的工厂类,使得它具有超越简单工厂的优越性,让系统更加符合开闭原则。

二、模式结构

工厂方法模式包含4个角色:Product、ConcreteProduct、Factory、ConcreteFactory

Product:抽象产品角色

ConcreteProduct:具体产品角色

Factory:抽象工厂角色

ConcreteFactory:具体工厂角色

 

三、设计与实现

需求:设计一个水果市场,商家店铺有橘子、苹果、香蕉等,每个商家专营自己的店铺水果,各个水果工厂生产自己的水果。

实现:

1.Product

package FactoryMethodPattern;
/**
 * 抽象产品接口
 * 提供两个方法,查看水果种类 & 查看水果价格
 * @author CHAoLip
 *
 */

public interface FruitProduct {

	public void showFruit();
	
	public void showPrice();
	
}

2.ConcreteProduct

具体产品,这里当然是你想吃的各种水果啦,要注意与之后的具体工厂相对应,具体工厂生产对应的具体水果!

2.1 AppleProduct 

苹果!

package FactoryMethodPattern;
/**
 * 具体产品类 --- 苹果类
 * @author CHAoLip
 *
 */

public class AppleProduct implements FruitProduct {

	public AppleProduct(){
		System.out.println("欢迎来到苹果专卖店!已准备好为您服务!");
	}
	
	@Override
	public void showFruit() {
		System.out.println("这是一家苹果专卖店!");

	}

	@Override
	public void showPrice() {
		System.out.println("苹果的价钱是7.9元/斤!");

	}

}

2.2 BananerProduct 

香蕉!打折中。。。

package FactoryMethodPattern;
/**
 * 具体水果类 --- 香蕉类
 * @author CHAoLip
 *
 */

public class BananerProduct implements FruitProduct {

	public BananerProduct(){
		System.out.println("欢迎来到香蕉专卖店,已准备好为您服务!");
	}
	
	@Override
	public void showFruit() {
		System.out.println("这是一家香蕉专卖店!");

	}

	@Override
	public void showPrice() {
		System.out.println("国产香蕉打折促销,价格是3.8元/斤!");

	}

}

2.3 OrangeProduct 

橘子!

package FactoryMethodPattern;
/**
 * 具体产品类 --- 橘子类
 * @author CHAoLip
 *
 */

public class OrangeProduct implements FruitProduct {

	public OrangeProduct(){
		System.out.println("欢迎来到橘子专卖店,已准备好为您服务!");
	}
	
	@Override
	public void showFruit() {
		System.out.println("这是一家橘子专卖店!");

	}

	@Override
	public void showPrice() {
		System.out.println("橘子的价格是6.8元/斤!");

	}

}

3. Factory

抽象工厂接口,他是所有工厂的父类,这样在我们想增加某种水果(产品)时,只需增加一个对象的工厂类就可以啦,利用工厂类去生产产品,不用费心费力的去改简单工厂中客户端以及工厂中的代码啦,这就是为什么它比简单工厂模式更优的原因啦!

package FactoryMethodPattern;
/**
 * 抽象工厂接口
 * @author CHAoLip
 *
 */

public interface FruitFactory {

	public FruitProduct produceFruit();
	
}

4. ConcreteFactory

具体工厂有多个,每个不同的工厂可以生产不同的产品,注意工厂的返回值类型应是对应的具体产品类型。(不返回产品的话这个工厂有什么用呢。。。)

4.1 AppleFactory 

苹果工厂 --- 生产苹果啦

package FactoryMethodPattern;
/**
 * 具体工厂类 --- 苹果工厂类
 * @author CHAoLip
 *
 */

public class AppleFactory implements FruitFactory {

	@Override
	public AppleProduct produceFruit() {
		AppleProduct appleProduct = new AppleProduct();
		appleProduct.showFruit();
		appleProduct.showPrice();
		System.out.println("请问您想买多少苹果呢?");
		return appleProduct;
	}

}

4.2 BananerFactory 

香蕉工厂 --- 生产香蕉啦!

package FactoryMethodPattern;
/**
 * 具体工厂类 --- 香蕉工厂类
 * @author CHAoLip
 *
 */

public class BananerFactory implements FruitFactory{

	@Override
	public FruitProduct produceFruit() {
		BananerProduct bananerProduct = new BananerProduct();
		bananerProduct.showFruit();
		bananerProduct.showPrice();
		System.out.println("请问您想买多少香蕉呢?趁着活动价多买些吧!");
		return bananerProduct;
	}

}

4.3 OrangeFactory 

橘子工厂 --- 生产橘子啦!

package FactoryMethodPattern;
/**
 * 具体工厂类 ---橘子工厂类
 * @author CHAoLip
 *
 */

public class OrangeFactory implements FruitFactory {

	@Override
	public FruitProduct produceFruit() {
		OrangeProduct orangeProduct = new OrangeProduct();
		orangeProduct.showFruit();
		orangeProduct.showPrice();
		System.out.println("请问您想买多少橘子呢?");
		return orangeProduct;
	}

}

5.客户端

生产具体工厂,之后也就可以生产具体的产品

在客户端代码中,我们只需要关心工厂类即可,不同的具体工厂可以生产不同的产品。

package FactoryMethodPattern;

/**
 * 客户端  创建具体工厂
 * @author CHAoLip
 *
 */
public class FruitClient {

	public static void main(String[] args) {
		FruitFactory fruitFactory =new BananerFactory();
		fruitFactory.produceFruit();
	}
}

6.结果

工厂方法模式_第1张图片

你可能感兴趣的:(工厂方法模式,Java,设计模式)