设计模式的总结二:创造型模式-抽象工厂模式

一:创造型模式的理解:

    1.抽象工厂模式

      抽象工厂模式是是相比工厂方法模式抽象层次更高。抽象工厂返回的是一组类的工厂,然后每个工厂能生产一类产品(有的书上称之为产品族,类似可以把公司抽象成的工厂,谷歌就是这个工厂的子类,苹果也是这个工厂的子类。谷歌有搜索引擎,安卓,地图等产品,苹果有手机,ipad和mac等产品。类比的看都是一种抽象工厂模式的实例)。

    同工厂方法模式类似(工厂方法模式就是返回多个子类中的一个),抽象工厂模式能够返回一个工厂,一个工厂就能返回多个子类中的一个。

    可以说工厂模式是创造型模式的典型示例,抽象公共模式是工厂方法模式的扩展,允许创建更多类型的对象。

   具体类包括:

  抽象工厂:声明一个用于完成抽象产品对象创建操作的接口。

  具体工厂:实现创建具体产品对象的操作。

  抽象产品:声明一个用于一类产品对象的接口。

  具体产品:定义相应的具体工厂来创建的产品对象。 

  客户端:使用抽象工厂创建特定产品的工厂,生成特定的产品。

2.抽象工厂带来的优势:

  客户端和具体的产品类之间彻底解耦,这是抽象工厂模式最主要的好处之一。我们可以很轻松的添加一类产品,只需要实现这类产品的工厂和定义这类产品就行。

  3.代码实现:

 

public class Part {
    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
... ...
public abstract class Car {
    //定义的一个抽象工厂类
    public String name = "Car";

    abstract Part getWheels();
    abstract Part getEngines();
    abstract Part getBody();

    public void show(){
        System.out.println("-------------------------------------------");
        System.out.println("Car name:" + name);
        System.out.println("wheels:" + getWheels().getName());
        System.out.println("engines:" + getEngines().getName());
        System.out.println("body:" + getBody().getName());
        System.out.println("-------------------------------------------");
    }
}
... ...
public class BenzCar extends Car {
    //抽象工厂类的子类
   private String name = "BenzCar";

    public BenzCar(String name){
        this.name = name;
    }

    @Override
    Part getWheels() {
        Part part = new Part();
        part.setName(name + " Wheels");
        return part;
    }

    @Override
    Part getEngines() {
        Part part = new Part();
        part.setName(name + " Engines");
        return part;
    }

    @Override
    Part getBody() {
        Part part = new Part();
        part.setName(name+ "  Body" );
        return part;
    }
}
... ...
public class BmwCar extends Car {
    //抽象工厂类的子类
    private String name = "BmwCar";

    public BmwCar(String name){
        this.name = name;
    }

    @Override
    Part getWheels() {
        Part part = new Part();
        part.setName(name + " Wheels");
        return part;
    }

    @Override
    Part getEngines() {
        Part part = new Part();
        part.setName(name + " Engines");
        return part;
    }

    @Override
    Part getBody() {
        Part part = new Part();
        part.setName(name + "  Body");
        return part;
    }
}
... ...
    public static void main(String[] args){
        //客户端上 创建一个宝马的车
       Car bmwCar = new BmwCar("BmwCar");
       bmwCar.show();

        //再添加一个奔驰的车 只要添加相应的类就可以了,client可以很简洁
       Car benzCar = new BenzCar("BenzCar");
        benzCar.show();
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值