抽象工厂定义
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类(关于这句话的解释请在本文搜索haha)。
需求
不同国家的玩具店都卖自己国家的玩具,所以各个国家都有自己的玩具工厂生产自己国家的玩具供玩具店拿货(中国玩具工厂、外国玩具工厂),各国工厂的共同点是都生产三个等级的玩具,bad、normal、good。
实现
设计抽象工厂
根据需求也就是说生产三个等级的玩具是公共部分,所以我们可以将生产这三种品质玩具的方法抽象出来定义在工厂接口中,而它的实现类可以是中国玩具工厂、外国玩具工厂,它们各自实现三个生产玩具的方法来创建不同国家的不同等级的玩具。
下面是工厂的代码:
//接口工厂
public interface ToyFactory {
/**
* 创建差玩具
*/
Toy createBadToy();
/**
* 创建普通玩具
*/
Toy createNormalToy();
/**
* 创建好玩具
*/
Toy createGoodToy();
}
//接口工厂的实现类
class ChinaToyFactory implements ToyFactory {
/**
* 返回中国劣质玩具
*/
@Override
public ChinaBadToy createBadToy() {
return new ChinaBadToy();//haha:在这里你可以看到方法名为createBadToy这个,它没有任何提示要返回哪个国家的玩具,但是会返回一个中国差玩具,即是说,你调用不同工厂的同名方法会得到不同的产品(中国差玩具、美国差玩具),即调用者只需要保证调用的是特定工厂的方法,就可以得到它想要的产品,实现了产品创建和。
}
/**
* 返回中国普通玩具
*/
@Override
public ChinaNormalToy createNormalToy() {
return new ChinaNormalToy();
}
/**
* 返回中国好玩具
*/
@Override
public ChinaGoodToy createGoodToy() {
return new ChinaGoodToy();
}
}
设计玩具
根据需求可以知道玩具有国籍之分,如下:
所以我们设计玩具实现类为不同国籍与不同等级如下:
代码如下:
public interface Toy {
void printToyInf();
}
class ChinaBadToy implements Toy {
@Override
public void printToyInf() {
System.out.println("中国糟糕玩具");
}
}
class ChinaNormalToy implements Toy {
@Override
public void printToyInf() {
System.out.println("中国普通玩具");
}
}
class ChinaGoodToy implements Toy {
@Override
public void printToyInf() {
System.out.println("中国好玩具");
}
}
设计玩具店
玩具店代码如下:
//玩具店接口
public interface ToyStore {
Toy getNormalToy();//用来获取一个普通玩具
Toy getBddToy();//获取一个糟糕的玩具
Toy getGoodToy();//获取一个好玩具
}
//玩具店实现之一
class ChinaToyStore implements ToyStore {
final ToyFactory chinaToyFactory;
ChinaToyStore(ToyFactory toyFactory) {
this.chinaToyFactory = toyFactory;
}
@Override
public Toy getNormalToy() {//调用工厂的创建方法来获取玩具
return chinaToyFactory.createNormalToy();
}
@Override
public Toy getBddToy() {//调用工厂的创建方法来获取玩具
return chinaToyFactory.createBadToy();
}
@Override
public Toy getGoodToy() {//调用工厂的创建方法来获取玩具
return chinaToyFactory.createGoodToy();
}
}
客户端代码
public class ToyClient {
public static void main(String[] args) {
ToyStore toyStore = new ChinaToyStore(new ChinaToyFactory());
Toy toy = toyStore.getNormalToy();
toy.printToyInf();
}
}