java设计模式《抽象工厂模式》

抽象工厂模式
参考文档:http://c.biancheng.net/view/1351.html

总综合工厂
工厂方法模式只考虑生产同等级的产品,
但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品;
如电器厂既生产电视机又生产洗衣机或空调等。

抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。
比如 针对电器厂及生产电视有生产洗衣机这种模式 构成一个产品族,
其中生产电视机为一个级别,生产洗衣机为一个级别。
产品族之间也应该有类型上的差异,而这些差异在同一产品族中各个级别都有体现。

比如TC系列产品:TC电视机,TC洗衣机,
区别于海尔系列:海尔电视机,海尔洗衣机。
电视机,洗衣机为系列中的不同级别。

抽象工厂模式的扩展有一定的“开闭原则”倾斜性:

  1. 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。
  2. 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。

demo 结构

    1.工厂接口 、hair工厂实现类,TC工厂实现类。

     2.商品接口、电视机接口,洗衣机接口。并且商品接口是电视机接口与洗衣机接口的父接口。

        TC电视机实现类,TC洗衣机是下类;海尔电视机实现类,海尔洗衣机实现类。

 

demo代码

step1.工厂接口与工厂实现类

   总的工厂接口

package java_basic.stu_design_mode.stu_AbstractFactory;

public interface MachineFactory {
    TelevisionMachine getTelevision();
    LaundryMachine getLaundry();
}

hair工厂实现类

package java_basic.stu_design_mode.stu_AbstractFactory;

public class HairFactory implements MachineFactory {
    @Override
    public TelevisionMachine getTelevision() {
        return new HairTelevision();
    }

    @Override
    public LaundryMachine getLaundry() {
        return new HairLaundry();
    }
}

TC工厂实现类

package java_basic.stu_design_mode.stu_AbstractFactory;

public class TCFacory implements MachineFactory {
    @Override
    public TelevisionMachine getTelevision() {
        return new TCTelevision();
    }

    @Override
    public LaundryMachine getLaundry() {
        return new TCLaundry();
    }
}

step2 商品接口

  总的商品接口,约定所有商品的共同接口

package java_basic.stu_design_mode.stu_AbstractFactory;

public interface Machine {
    String getMachineName();
}

级别接口。由于不同品族的相同级别的商品存在共性,因此提出接口。

        电视级别的接口

package java_basic.stu_design_mode.stu_AbstractFactory;

public interface TelevisionMachine extends Machine{
    void operationTelevision();
}

     洗衣机级别的接口

package java_basic.stu_design_mode.stu_AbstractFactory;

public interface LaundryMachine extends Machine {
    void operationLaundry();
}

step3 商品实现类

   hair品族

   hair电视机实现类

package java_basic.stu_design_mode.stu_AbstractFactory;

public class HairTelevision implements  TelevisionMachine {

    @Override
    public void operationTelevision() {
        System.out.println("Hair电视机的区别于其他电器的操作");
    }

    @Override
    public String getMachineName() {
        return "this is Hair television";
    }
}

  hair洗衣机实现类

package java_basic.stu_design_mode.stu_AbstractFactory;

public class HairLaundry implements LaundryMachine {
    @Override
    public String getMachineName() {
        return "this is hair laundry";
    }

    @Override
    public void operationLaundry() {
        System.out.println("Hair洗衣机的区别于其他电器的操作");
    }
}

TC品族

TC电视机

package java_basic.stu_design_mode.stu_AbstractFactory;

public class TCTelevision implements TelevisionMachine {
    @Override
    public String getMachineName()  {
        return "this is TC television";
    }

    @Override
    public void operationTelevision() {
        System.out.println("TC电视机的区别于其他电器的操作");
    }
}

TC洗衣机

package java_basic.stu_design_mode.stu_AbstractFactory;

public class TCLaundry implements LaundryMachine {
    @Override
    public String getMachineName() {
        return "this is Tc laundry";
    }

    @Override
    public void operationLaundry() {
        System.out.println("TC洗衣机的区别于其他电器的操作");
    }
}

step4 调用

package java_basic.stu_design_mode.stu_AbstractFactory;

import org.junit.Test;

public class Main {
    @Test
    public void method() {
        //获取hair产品族工厂
        MachineFactory hr = new HairFactory();
        LaundryMachine lm = hr.getLaundry();
        lm.operationLaundry();//Hair洗衣机的区别于其他电器的操作
        System.out.println(lm.getMachineName());//this is hair laundry


        //获取TC产品族工厂
        MachineFactory tc = new TCFacory();
        TelevisionMachine tcs = tc.getTelevision();
        tcs.operationTelevision();//TC电视机的区别于其他电器的操作
        System.out.println(tcs.getMachineName());//this is TC television
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值