一 简单工厂(静态工厂)
1.1 什么是简单工厂
就是一个可以根据客户端或者配置文件提供参数,从而选择创建不同对象的工厂模式。本质在于选择不同产品的实现。
特点: 不符合开闭原则;简单
场景: 适合明确知道未来产品类型很少变化的场景,平常使用的较多。
一般简单工厂我们都不需要实例化,我们可以把它实现成工具类,直接使用静态方法,所以简单工厂的方法通常都是静态的,也被称为静态工厂。
1.2 代码示例
public interface CPU {
public void desc();
}
public class IntelCPU implements CPU {
public void desc() {
System.out.println("英特尔(Intel) i5 7500 酷睿四核 盒装CPU处理器");
}
}
public class AMDCPU implements CPU{
public void desc() {
System.out.println("锐龙 AMD Ryzen 5 1600X 处理器6核AM4接口 3.6GHz 盒装");
}
}
public class SimpleFactory {
public static CPU createCPU(String brand) {
if ("Intel".equals(brand)) {
return new IntelCPU();
} else if ("AMD".equals(brand)) {
return new AMDCPU();
}
return null;
}
}
二 工厂方法
2.1 什么工厂方法
即父类负责定义创建产品对象的公共接口,而工厂子类负责创建具体的产品对象,即将产品的实例化操作延迟到工厂子类,由子类决定到底实例化什么产品(而简单工厂没有子类,就是一个工厂类,然后提供一个方法实例化子类)。
特点: 符合开闭原则,新增加产品类型,不需要在修改已有的类,而是直接创建新的工厂子类,进行产品实例化;稍微有一点麻烦
场景: 适合产品类型未来不确定是不是需要增加
工厂可以有很多创建对象的抽象方法。交给工厂子类实现的它总共有四个角色:
抽象工厂,具体工厂,抽象产品,具体产品
2.2 代码示例
/** 支付渠道 */
public interface PayChannel {
void pay(BigDecimal money);
}
public class AliPay implements PayChannel {
@Override
public void pay(BigDecimal money) {
System.out.println("支付宝支付成功!支付金额:"+money);
}
}
public class WeixinPay implements PayChannel {
@Override
public void pay(BigDecimal money) {
System.out.println("微信支付成功!支付金额:"+money);
}
}
public interface PayFactory {
public PayChannel createPayChannel();
}
public class AlipayFactory implements PayFactory {
@Override
public PayChannel createPayChannel() {
return new AliPay();
}
}
public class WeixinPayFactory implements PayFactory {
@Override
public PayChannel createPayChannel() {
return new WeixinPay();
}
}
public class Client {
public static void main(String[] args) {
AlipayFactory alipayFactory = new AlipayFactory();
PayChannel payChannel = alipayFactory.createPayChannel();
payChannel.pay(new BigDecimal(100));
WeixinPayFactory weixinPayFactory = new WeixinPayFactory();
payChannel = weixinPayFactory.createPayChannel();
payChannel.pay(new BigDecimal(200));
}
三 抽象工厂
首先在这里我们需要明白2个概念,产品等级和产品簇
通常我们遇到可能需要创建一系列的对象,比如家里面装修,就需要一系列海尔和海信的产品,让他们各自生产自己相关对象。所以他的本质就是要创建一系列的产品。
public interface Refrigerator {
public abstract void freeze(Food food);
public abstract void desc();
}
public class HaierRefrigerator implements Refrigerator {
public void freeze(Food food) {
System.out.println("食物: "+food.getFoodName());
System.out.println("颜色: "+food.getColor());
System.out.println("类型: "+food.getType());
}
public void desc() {
System.out.println("海尔(Haier)BCD-258WDPM 258升 风冷无霜三门冰箱 除菌 3D立体环绕风不风干 中门5℃~-18℃变温室");
}
}
public class HisenseRefrigerator implements Refrigerator {
public void freeze(Food food) {
System.out.println("食物: "+food.getFoodName());
System.out.println("颜色: "+food.getColor());
System.out.println("类型: "+food.getType());
}
public void desc() {
System.out.println("海信(Hisense)BCD-218D/Q 218升 三门冰箱 家用保鲜 节能静音 快速冷冻");
}
}
public interface TV {
public abstract void show(Movie movie);
public abstract void feature();
}
public class HaierTV implements TV {
public void show(Movie movie) {
System.out.println("影片: " + movie.getMovieName());
System.out.println("导演: " + movie.getDirector());
System.out.println("评分: " + movie.getScore());
System.out.println("地区: " + movie.getCountry());
}
public void feature(){
System.out.println("海尔模卡(MOOKA)U55H3 55英寸 4K安卓智能网络纤薄窄边框UHD高清LED液晶电视");
}
}
public class HisenseTV implements TV {
public void show(Movie movie) {
System.out.println("影片: " + movie.getMovieName());
System.out.println("导演: " + movie.getDirector());
System.out.println("评分: " + movie.getScore());
System.out.println("地区: " + movie.getCountry());
}
public void feature(){
System.out.println("海信(Hisense)LED55EC500U 55英寸 4K超高清 VIDAA4.0 智能电视 丰富影视教育资源 (黑色)");
}
}
public interface AbstractFactory {
public Refrigerator getRefrigerator();
public TV getTV();
}
public class HaierFactory implements AbstractFactory {
public Refrigerator getRefrigerator() {
return new HaierRefrigerator();
}
public TV getTV() {
return new HaierTV();
}
}
public class HisenseFactory implements AbstractFactory {
public Refrigerator getRefrigerator() {
return new HisenseRefrigerator();
}
public TV getTV() {
return new HisenseTV();
}
}
public class Food {
private String foodName;
private String color;
private String type;
public Food() {
}
public Food(String foodName, String color, String type) {
this.foodName = foodName;
this.color = color;
this.type = type;
}
// getter、setter
}
public class Movie {
private String movieName;
private String director;
private float score;
private String country;
public Movie() {
}
public Movie(String movieName, String director, float score, String country) {
this.movieName = movieName;
this.director = director;
this.score = score;
this.country = country;
}
// getter 和 setter
}
public class Client {
public static void main(String[] args) {
AbstractFactory factory = new HaierFactory();
Refrigerator refrigerator = factory.getRefrigerator();
refrigerator.desc();
Food food = new Food("五花肉","红色","肉类");
refrigerator.freeze(food);
TV tv = factory.getTV();
tv.feature();
Movie movie = new Movie("San Andreas","布拉德·佩顿",8.7F,"美国");
tv.show(movie);
}
}