设计模式——抽象工厂模式

什么是抽象工厂模式

简单工厂模式可以生产多种产品,但是不满足开闭原则,工厂模式满足开闭原则,但是一个工厂不能生产多个商品,而抽象工厂模式相当于结合了两者的优点,在一定程度上可以满足开闭原则,同时一个工厂也可以生产多个商品。

 

抽象工厂模式的角色

AbstractFactory:抽象工厂,定义工厂的共有方法

ConcreteFactory:具体工厂,定义工厂生产的具体产品

AbstratcProduct:抽象产品,定义产品的共有特性

Product:具体产品,用于描述具体的产品信息

 

抽象工厂模式有两个概念:
产品等级结构:上图红框处

产品组:上图黑框处

 

下面简单实现一个实例

 

Factory:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public interface Factory { 
    chopsticks getchopsticks();
    lunch getLunch();
}

 

lunch:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public interface lunch {
    void eat();
}

 

chopsticks:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public interface chopsticks {
    void use();
}

 

ProductLunchA:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class ProductLunchA implements lunch{

    @Override
    public void eat() {
        System.out.println("吃小龙虾");
    }
    
}

ProductLunchB:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class ProductLunchB implements lunch{

    @Override
    public void eat() {
        System.out.println("吃椰子鸡");
    }
    
}

 

ProductChopsticksA:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class ProductChopsticksA implements chopsticks{

    @Override
    public void use() {
        System.out.println("使用木制筷子");
    }
    
}

 

ProductChopsticksB:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class ProductChopsticksB implements chopsticks{

    @Override
    public void use() {
        System.out.println("使用玉制筷子");
    }
    
}

 

FactoryA:

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class FactoryA implements Factory{

    @Override
    public chopsticks getchopsticks() {
        return new ProductChopsticksA();
    }

    @Override
    public lunch getLunch() {
        return new ProductLunchA();
    }
    
}

 

FactoryB:
 

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class FactoryB implements Factory{

    @Override
    public chopsticks getchopsticks() {
        return new ProductChopsticksB();
    }

    @Override
    public lunch getLunch() {
        return new ProductLunchB();
    }
    
}

 

main:
 

package AbstractFactory;

/**
 *
 * @author lzy
 */
public class main {
    public static void main(String[] args){
    Factory faca=new FactoryA();
    lunch pa=faca.getLunch();
    chopsticks cha=faca.getchopsticks();
    cha.use();
    pa.eat();
    
    Factory facb=new FactoryB();
    lunch pb=facb.getLunch();
    chopsticks chb=facb.getchopsticks();
    chb.use();
    pb.eat();    
    
    
    }

 

运行结果:

 

抽象工厂模式的一点思考

优点:
抽象工厂模式使一个工厂可以生产多种商品,向客户端屏蔽了生产产品的具体细节,当我们添加产品组时,只需要在创建一个工厂用于生产对应的产品即可,可以很好的满足开闭原则。

 

缺点:

当我们添加产品等级结构时,我们需要更改抽象工厂以便生产新的产品等级结构,抽象工厂的更改意味着我们要更改所有的具体工厂类,此时不能很好的满足开闭原则

 

抽象工厂模式中一个具体工厂生产的产品之间应该具有一定联系,例如例子中的食物与筷子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值