在学习工厂模式之前,先得了解一下产品等级和产品族的概念。
产品等级:不同品牌的同一产品处于同一产品等级。
产品族:同一品牌的不同产品 处于同一产品族。
比如华为平板,小米平板,苹果平板处于同一产品等级。
比如华为平板,华为手机,华为电脑处于同一产品族。
当数据源或者对象的创建比较复杂时,可以考虑采用工厂模式。
简单工厂模式很简单,一般只有一个产品等级。
比如只生产手机:苹果手机,华为手机这类的
简单工厂模式很简单,就三步
1.创建一个产品接口(手机)
2.对该接口实现(华为手机,苹果手机)
3.写一个工厂类,用来生成对应的手机,一般提供一个静态方法,方法只有一个入参,用来选择生成的手机是什么牌子的。
//1.创建一个产品接口(手机)
public interface Phone{void show();
}//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部华为手机");}
}public class PingGuoPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部苹果手机");}
}//写一个工厂类,用来生成对应的手机
public class PhoneFactory{// 法一:public static Phone createPhone(String brand){Phone phone = null;Switch(brand){case "Apple" :phone = new PingGuoPhone();break;case "HuaWei" :phone = new HuaWeiPhone ();break;default:break;}return phone;}// 法二:public static T createPhone(Class clz){Phone phone = null;try{phone = clz.newInstance();} catch(InstantiationException e){e.printStackTrace();} catch(IllegalAccessException e){e.printStackTrace();}return (T) iceCream;}
}
一般来说简单工厂类是法一的写法,此时如果你加一个小米手机,你得先实现phone接口,这个没问题,但是你还得把工厂里面的createPhone方法改写,不符合开闭原则。法二不存在问题。
此外工厂类负责了所有产品的实例化,违反了单一原则。法一和法二都有问题
在简单工厂模式上稍作修改,对工厂进行抽象
相比较简单工厂模式,对工厂进行了抽象。
//1.创建一个产品接口(手机)
public interface Phone{void show();
}//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部华为手机");}
}public class PingGuoPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部苹果手机");}
}//创建工厂接口
public interface PhoneFactory{public Phone createPhone();
}
//对该接口实现(华为手机工厂,苹果手机工厂)
public class PingGuoPhoneFactory implements PhoneFactory{@Overridepublic Phone createPhone(){return new PingGuoPhone();}
}public class HuaWeiPhoneFactory implements PhoneFactory{@Overridepublic Phone createPhone(){return new HuaWeiPhone();}
}
为了弥补简单工厂的缺点,普通工厂模式对工厂类也做了抽象
这样一个工厂只生产一个品牌手机,复合单一原则。
如果新增小米手机不用修改代码,直接扩展。
对于拓展同一等级的产品很友好,但在这种情况下只能生产这么一种产品,手机,不能生产多产品。
要生产多个牌子的产品,且产品族产品数量有多个。
比如要生产苹果下面的手机和平板,华为下面的手机和平板
相比较于普通工厂模式有两点不同
1:多了一个产品 平板
2:工厂类中多了一个生产平板的方法
//1.创建一个产品接口(手机)
public interface Phone{void show();
}//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部华为手机");}
}public class PingGuoPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部苹果手机");}
}//2.创建一个产品接口(平板)
public interface Pad{void show();
}//对该接口实现(华为平板,苹果平板)
public class HuaWeiPad implements Pad{@Overridepublic void show(){System.out.println("生产了一部华为平板");}
}public class PingGuoPad implements Pad{@Overridepublic void show(){System.out.println("生产了一部苹果平板");}
}//创建平板工厂接口
public interface Factory{public Pad createPad();public Phone createPhone();
}
//对该接口实现(华为平板工厂,苹果平板工厂)
public class PingGuoFactory implements Factory{@Overridepublic Pad createPad(){return new PingGuoPad();}@Overridepublic Phone createPhone(){return new PingGuoPhone();}
}public class HuaWeiFactory implements Factory{@Overridepublic Pad createPad(){return new HuaWeiPad();}@Overridepublic Phone createPhone(){return new HuaWeiPhone();}
}
可以新增一个产品族,比如加个小米系列
但不能增加产品等级,就不能加路由器产品。
上一篇:多重共线性如何分析?