设计模式之抽象工厂模式

最近在学习大话设计模式,写一下自己的学习体会和实现小例子。

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

理解:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。像下面例子写的,电脑工厂里可以生产鼠标和键盘,然后有戴尔和惠普两个品牌,当调用戴尔工厂的时候,生产出来的就是戴尔的键盘和鼠标

代码:

电脑工厂:可以生产键盘和鼠标:

public interface PcFactory {
    //生产鼠标
    Mouse createMouse();
    //生产键盘
    Keybo createKeybo();
}

电脑工厂里有两个品牌生产键盘鼠标:

戴尔:

public class DellFactory implements PcFactory {
    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

    @Override
    public Keybo createKeybo() {
        return new DellKeybo();
    }
}

 

惠普:

public class HpFactory implements PcFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }

    @Override
    public Keybo createKeybo() {
        return new HpKeybo();
    }
}

产品——鼠标接口:

public interface Mouse {
    void build();
}

 

产品——键盘接口:

public interface Keybo {
    void build();
}

产品的实现类:

鼠标:

public class DellMouse implements Mouse {
    @Override
    public void build() {
        System.out.println("戴尔鼠标");
    }
}

 

public class HpMouse implements Mouse {
    @Override
    public void build() {
        System.out.println("惠普鼠标");
    }
}

键盘:

public class DellKeybo implements Keybo {
    @Override
    public void build() {
        System.out.println("戴尔键盘");
    }
}

 

public class HpKeybo implements Keybo {
    @Override
    public void build() {
        System.out.println("惠普鼠标");
    }
}

测试:

 

public static void main(String[] args) {
    PcFactory factory = new DellFactory();
    Keybo keybo = factory.createKeybo();
    keybo.build();
    Mouse mouse = factory.createMouse();
    mouse.build();
}

 抽象工厂模式和反射的改进:

由于每一次加一个品牌就要增加PcFactory的子类XXfactory,利用抽象可以简化代码:

public class Factory {

    public Mouse createMouse(String name){
        Mouse mouse = null;
        String path = "pattern.abstractfactory.Interface.mouseImpl." + name;
        try {
            mouse =  (Mouse) Class.forName(path).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return mouse;
    }

    public Keybo createKeybo(String name){
        Keybo keybo = null;
        String path = "pattern.abstractfactory.Interface.keyboImpl." + name;
        try {
            keybo = (Keybo) Class.forName(path).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return keybo;
    }
}

 测试:

public static void main(String[] args) {
    Factory factory = new Factory();
    Mouse mouse = factory.createMouse("DellMouse");
    if (mouse != null){
        mouse.build();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值