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