简单工厂:
实际的使用需求只和工厂对接,不关注具体的实现过程,需要什么,告诉工厂,工厂直接给我们返回产品。
比如:我们现在设置了一个产品类型Product,下属有苹果Apple,香蕉Banana,橘子Orange等等;
现在有一个工厂类 FruitFactory,专门生产Product,具体生产哪个,你告诉我名字就行getProduct(String name).
这就是一个简单工厂类的实现过程,工厂作为交互类,细节工厂决定,需求由目标群体决定。
产品类:
package cn.pers.sample.simplefactory;
import lombok.Getter;
import lombok.Setter;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/7/20 14:13
*/
@Setter
@Getter
public abstract class Product {
public String color;
public String weight;
public String name;
public String desc;
public void printName(){
System.out.println(this.name);
}
public void printMethod(){
System.out.println("生产了一个水果.");
}
public abstract void printInfo();
}
产品线下的两个具体产品:
package cn.pers.sample.simplefactory;
import lombok.Getter;
import lombok.Setter;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/7/20 13:58
*/
@Getter
@Setter
public class Apple extends Product {
private String type;
private String shape;
@Override
public void printInfo() {
//System.out.println(this.type + ":" + this.shape);
System.out.println("苹果,圆形,红色");
}
}
package cn.pers.sample.simplefactory;
import lombok.Getter;
import lombok.Setter;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/7/20 13:59
*/
@Getter
@Setter
public class Banana extends Product{
private String type;
private String shape;
@Override
public void printInfo() {
System.out.println("香蕉,弯曲形状,黄色");
}
}
下面是我们的工厂类,根据具体的要求生产对应的产品:
package cn.pers.sample.simplefactory;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/7/20 14:00
*/
public class FruitFactory {
public static Product getProduct(String type) {
if ("apple".equalsIgnoreCase(type)) {
return new Apple();
} else if ("banana".equalsIgnoreCase(type)) {
return new Banana();
} else {
throw new RuntimeException("暂不支持该种类型水果.");
}
}
}
最后是我们的外部使用方式,直接和工厂交互:
package cn.pers.sample.simplefactory;
/**
* 一个抽象产品,一个工厂类,提供必需的信息,工厂生产对应的产品,客户端不关注实现过程。<br></>
* 简单工厂:实际的使用需求只和工厂对接,不关注具体的实现过程,需要什么,告诉工厂,工厂直接给我们返回产品。
* @author WeiSong <br>
* @since 0.0.1
* 2020/7/20 14:22
*/
public class Main {
public static void main(String[] args) {
final Product apple = FruitFactory.getProduct("apple");
apple.printMethod();
apple.printInfo();
final Product banana = FruitFactory.getProduct("banana");
banana.printMethod();
banana.printInfo();
}
}
生产效果:
生产了一个水果.
苹果,圆形,红色
生产了一个水果.
香蕉,弯曲形状,黄色
编者按:
简单工厂模式不属于标准的23种设计模式之一,但一般都作为基础的一种模式来学习,提供了我们的一种思路和方式,依赖抽象,为后面的工厂方法和抽象工厂提供了敲门砖。
一句话,工厂生产抽象化的产品,工厂和外部交互,工厂是分界线。