抽象工厂是什么?
抽象工厂是创建型模式的一种,也叫超级工厂。抽象工厂是普通工厂的升级版,是一个专门生产工厂用的抽象工厂。
抽象工厂可以干嘛?
主要解决一个在单一工厂的时候,想要创造多个工厂很繁琐和臃肿并且耦合度也很高。比如:生产小米手机的不同版本8、9、10肯定是不同流水线,如果按照原来的工厂模式,要再造一个工厂再来生产,这样的话就费时费力,并且很繁琐,将生产小米的工厂抽象为一个超级工厂,通过这个超级工厂下面去创建8、9、10不同的工厂,很好的遵循了开-闭原则。这个就像一个公司成为了一个总公司,不同的子公司复制不同的模式。一个总公司下面有N多子公司一样。而总公司是一个超级工厂,子公司就像不同工厂。每个子公司经营不同的业务/产品。
优点:
缺点:
会使代码关系复杂、庞大、看起来很难理解;
类图
实现代码
/**
* @Auther: csh
* @Date: 2020/5/17 17:02
* @Description:抽象手机接口
*/
public interface AbstractMoblie {
void showModel();
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:41
* @Description:具体手机接口
*/
public interface EightMobile extends AbstractMoblie {
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:49
* @Description:小米8实现
*/
public class EightMobileImpl implements EightMobile {
//单列
private EightMobileImpl(){
}
//单列 饿汉
private static EightMobileImpl eightMobile = new EightMobileImpl();
public static final EightMobileImpl getInstance(){
return eightMobile;
}
@Override
public void showModel() {
System.out.println("小米8");
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:41
* @Description:具体手机接口
*/
public interface NightMobile extends AbstractMoblie {
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:49
* @Description:小米9
*/
public class NightMobileImpl implements NightMobile {
private static NightMobileImpl nightMobile = new NightMobileImpl();
private NightMobileImpl() {
}
//单列 饿汉
public static final NightMobileImpl getInstance(){
return nightMobile;
}
@Override
public void showModel() {
System.out.println("小米9");
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:41
* @Description:小米10接口
*/
public interface TenMobile extends AbstractMoblie{
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:50
* @Description:小米10实现
*/
public class TenMobileImpl implements TenMobile {
private static TenMobileImpl tenMobile = new TenMobileImpl();
private TenMobileImpl(){
}
public static final TenMobileImpl getInstance(){
return tenMobile;
}
@Override
public void showModel() {
System.out.println("小米10");
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:44
* @Description:手机工厂(超级工厂)
*/
public interface IMobileFactory {
//创建手机
AbstractMoblie crateEightMobile();
}
/**
* @Auther: csh
* @Date: 2020/5/17 17:44
* @Description:小米8工厂实现
*/
public class EightMoblieFactoryImpl implements IMobileFactory {
//单例
private static final EightMoblieFactoryImpl moblieFacotry = new EightMoblieFactoryImpl();
private EightMoblieFactoryImpl(){
}
public static EightMoblieFactoryImpl getInstance(){
return moblieFacotry;
}
@Override
public AbstractMoblie crateEightMobile() {
return EightMobileImpl.getInstance();
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 17:44
* @Description:小米9工厂实现
*/
public class NightMoblieFactoryImpl implements IMobileFactory {
//单例
private static final NightMoblieFactoryImpl moblieFacotry = new NightMoblieFactoryImpl();
private NightMoblieFactoryImpl(){
}
public static NightMoblieFactoryImpl getInstance(){
return moblieFacotry;
}
@Override
public AbstractMoblie crateEightMobile() {
return NightMobileImpl.getInstance();
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 17:44
* @Description:小米10工厂实现
*/
public class TenMoblieFactoryImpl implements IMobileFactory {
//单例
private static final TenMoblieFactoryImpl moblieFacotry = new TenMoblieFactoryImpl();
private TenMoblieFactoryImpl(){
}
public static TenMoblieFactoryImpl getInstance(){
return moblieFacotry;
}
@Override
public AbstractMoblie crateEightMobile() {
return TenMobileImpl.getInstance();
}
}
/**
* @Auther: csh
* @Date: 2020/5/17 16:56
* @Description:通过不同的工厂类创建
*/
public class Client {
public static void main(String[] args) {
//小米8
IMobileFactory eightFactory =EightMoblieFactoryImpl.getInstance();
AbstractMoblie eightMobile = eightFactory.crateEightMobile();
eightMobile.showModel();
//小米9
IMobileFactory mobileFactory =NightMoblieFactoryImpl.getInstance();
AbstractMoblie nightMobile = mobileFactory.crateEightMobile();
nightMobile.showModel();
//小米10
IMobileFactory tenFactory =NightMoblieFactoryImpl.getInstance();
AbstractMoblie tenMobile = tenFactory.crateEightMobile();
tenMobile.showModel();
}
}
结果
小米8
小米9
小米10
最后:
其实如果产品迭代非常快,而原来的产品并存使用,抽象工厂是非常合适的,抽象出来一个超级类,然后通过该类去实现不同的新业务,比如:支付接口、USB接口等。但是如果不同相同品类的不太建议,因为这样搞会非常复杂。