一:创造型模式的理解:
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();
}