工厂模式
提供一个创建一系列或相互依赖对象的接口,而无需值定他们的具体类
角色
- 抽象产品
- 具体产品
- 抽象工厂
- 具体工厂
使用场景
- 系统需要为用户提供多个对象,但不希望用户直接new实现这些对象(希望用户和创建对象的类脱耦)
- 系统需要为用户提供多个相关的对象,以便用户联合使用他们,但是又不希望用户来决定这些对象是如何关联的
- 系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可以用,不需要用户知道这些对象的创建过程
抽象产品
public abstract class UpperClother {
public abstract int getChestSize();
public abstract int getHeight();
public abstract String getName();
}
public abstract class Trousers {
public abstract int getWaistSize();
public abstract int getHeight();
public abstract String getName();
}
具体产品
public class WesternUpperClothers extends UpperClother {
private int chestSize;
private int height;
private String name;
public WesternUpperClothers(int chestSize, int height, String name) {
super();
this.chestSize = chestSize;
this.height = height;
this.name = name;
}
@Override
public int getChestSize() {
// TODO Auto-generated method stub
return this.chestSize;
}
@Override
public int getHeight() {
// TODO Auto-generated method stub
return this.height;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
public class WesternTrousers extends Trousers {
private int waistSize;
private int height;
private String name;
public WesternTrousers(int waistSize, int height, String name) {
super();
this.waistSize = waistSize;
this.height = height;
this.name = name;
}
@Override
public int getWaistSize() {
// TODO Auto-generated method stub
return this.waistSize;
}
@Override
public int getHeight() {
// TODO Auto-generated method stub
return this.height;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
抽象工厂
public abstract class ClothesFactroy {
public abstract UpperClother createUpperClothes(int chestSize,int height);
public abstract Trousers createTrousers(int waisSize,int height);
}
具体工厂
public class BeijingClothesFactroy extends ClothesFactroy {
@Override
public UpperClother createUpperClothes(int chestSize, int height) {
// TODO Auto-generated method stub
return new WesternUpperClothers(chestSize, height, "北京生产上衣");
}
@Override
public Trousers createTrousers(int waisSize, int height) {
// TODO Auto-generated method stub
return new WesternTrousers(waisSize, height, "北京生产裤子");
}
}
public class ShanghaiClothesFactroy extends ClothesFactroy {
@Override
public UpperClother createUpperClothes(int chestSize, int height) {
// TODO Auto-generated method stub
return new WesternUpperClothers(chestSize, height, "上海上衣");
}
@Override
public Trousers createTrousers(int waisSize, int height) {
// TODO Auto-generated method stub
return new WesternTrousers(waisSize, height, "上海裤子");
}
}
使用
import utils.P;
public class Shop {
UpperClother cloth;
Trousers trousers;
public void giveSuit(ClothesFactroy factroy,int chestSize,int height,int waistSize){
cloth=factroy.createUpperClothes(chestSize, height);
trousers=factroy.createTrousers(waistSize, height);
showInfo();
}
private void showInfo(){
P.p("<套装信息>");
P.p(cloth.getName()+"");
P.p("胸围:"+cloth.getChestSize());
P.p("身高:"+cloth.getHeight());
P.p(trousers.getName()+"");
P.p("腰围:"+trousers.getWaistSize());
P.p("身高:"+trousers.getHeight());
}
}
public class Application {
public static void main(String[] args) {
// TODO Auto-generated method stub
Shop shop=new Shop();
ClothesFactroy factroy=new BeijingClothesFactroy();
shop.giveSuit(factroy, 112, 180, 32);
factroy=new ShanghaiClothesFactroy();
shop.giveSuit(factroy, 120, 179, 54);
}
}