设计模式之-抽象工厂设计模式

 

对于抽象工厂模式实际上也是对简单工厂模式的一个加强,可以说也是对工厂方法模式的加强,对产品进行了进一步的抽象,类别划分得更加严密,等级更加的明确,还是以电视的例子为例,电视下面有长虹和创维,在简单工厂中只有一个大工厂,他可以生产出创维也可以生产长虹,而在工厂方法中对工厂进行了详细的分类将大工厂抽象出一个接口,分别创建具体实现的两个工厂,创维工厂跟长虹工厂,而在抽象工厂中会进行更进一步的抽象,我们会将品牌进行更详细的分类,电视下面有长虹和创维两个品牌,长虹电视可以有液晶电视和普通电视,创维同理,那么这样的话大工厂也将改变,以前是简单工厂和工厂方法都是直接获取产品,现在将改成获取液晶产品和一般产品,具体例子如下:

 

电视接口:

 

public interface TV {

    public String getName();

}

分别有创维和长虹两个品牌:

 

 

public abstract class ChuangWeiTV implements TV{

 

    @Override

    public abstract String getName();

      

   

 

}

 

 

 

public abstract class ChangHongTV implements TV{

 

    @Override

    public  abstract String getName();

 

}

 

 

创维和长虹又分别有液晶产品和一般产品

 

public class ChangHongPuTongTV extends ChangHongTV{

 

    @Override

    public String getName() {

      

       return "长虹普通电视";

    }

 

}

 

 

 

 

 

public class ChangHongYeJingTV extends ChangHongTV{

 

    @Override

    public String getName() {

      

       return "长虹液晶电视";

    }

 

}

 

 

 

public class ChuangWeiPuTongTV extends ChuangWeiTV{

 

    @Override

    public String getName() {

      

       return "创维普通电视";

    }

 

}

 

 

 

public class ChuangWeiYeJingTV extends ChuangWeiTV{

 

    @Override

    public String getName() {

      

       return "创维液晶电视";

    }

 

}

 

 

然后创建工厂

 

public  interface TVFactory {

       public  TV getPuTongTV();

       public  TV getYeJingTV();

}

 

 

 

 

 

public class ChangHongTVFactory implements TVFactory{

 

    @Override

    public TV getPuTongTV() {

      

       return new ChangHongPuTongTV();

    }

 

    @Override

    public TV getYeJingTV() {

       return new ChangHongYeJingTV();

    }

 

   

 

}

 

 

 

 

 

public class ChuangWeiTVFactory implements TVFactory{

 

    @Override

    public TV getPuTongTV() {

      

       return new ChuangWeiPuTongTV();

    }

 

    @Override

    public TV getYeJingTV() {

      

       return  new ChuangWeiYeJingTV();

    }

 

}

 

 

 

测试:

 

 

public class MainClass {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {

       TVFactory tvFactory = new ChangHongTVFactory();

       System.out.println(tvFactory.getPuTongTV().getName());

       System.out.println(tvFactory.getYeJingTV().getName());

       TVFactory tv1Factory = new ChuangWeiTVFactory();

       System.out.println(tv1Factory.getPuTongTV().getName());

       System.out.println(tv1Factory.getYeJingTV().getName());

    }

}

 

 

 

如果再增加一个品牌的话也可以做到不修改源代码,但是加入再出了什么新的类型的产品,比如什么长虹金刚电视,这样就得修改工厂接口了,所以这里的电视这样用并不是很合理,重在理解思想,这里只是一个例子,如果是水果的话分北方的水果和南方水果还有什么西北方什么的,这个总不会新出现一个地区就适用,达到实现OCP原则,总之工厂模式系列的三种大家可以权衡取舍,没有完美的模式只有合适的模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值