定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
理解:
工厂方法模式是对简单工厂模式的改进,通过引入抽象的工厂类,使得它具有超越简单工厂的优越性,让系统更加符合开闭原则。
工厂方法模式包含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.结果