抽象工厂模式
定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们它们的具体类。
优缺点、应用场景
优点
- 封装性。跟工厂方法模式一样的, 高层模型无需关心产品的实现类
缺点
抽象工厂模式最大的缺点就是产品族拓展非常困难。以AbstractYellowHuman和其子类为例,如果AbstractYellowHuman下增加一个产品C,则生产产品C的工厂(MaleFactory、FemaleFactory)就都需要加上生产产品C的方法(createC())。
一个产品的添加导致其他代码修改,这严重违反开闭原则。
所以使用抽象工厂模式需要考虑产品的变动以及控制产品生产的工厂的数量问题。
应用场景
一个对象组(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
实验小结
- 如果只实现接口的共性部分,使用抽象类将公共部分进行实现,个性部分由抽象类继续抽象(每一层抽象类只能实现一个维度的个性,比如AbstactWhiteHuman只能实现肤色,而不能实现性别,还需要交给下一层(抽象类/实现类)进行处理)
- 抽象工厂方面应该根据末层实现类个性的部分进行创建工厂
代码模拟场景
还是女娲造人,但是分性别
抽象工厂模式
UML图
产品的接口、抽象和实现
/**
* 人种接口
*/
public interface Human {
// 每个人都有肤色
void getColor();
// 人都会说话
void talk();
// 每个人都有性别
void getSex();
}
public abstract class AbstractYellowHuman implements Human {
@Override
public void getColor() {
System.out.println("黄人黄");
}
@Override
public void talk() {
System.out.println("吼吼吼♂全♂给♂党");
}
}
public abstract class AbstractWhiteHuman implements Human {
@Override
public void getColor() {
System.out.println("白人白");
}
@Override
public void talk() {
System.out.println("Do you like what you see?");
}
}
public abstract class AbstractBlackHuman implements Human {
@Override
public void getColor() {
System.out.println("黑咻咻");
}
@Override
public void talk() {
System.out.println("@!#&*^*!@^#*!@*&");
}
}
public class MaleYellowHuman extends AbstractYellowHuman {
@Override
public void getSex() {
System.out.println("黄人男性");
}
}
public class FemaleYellowHuman extends AbstractYellowHuman {
@Override
public void getSex() {
System.out.println("黄人女性");
}
}
public class MaleWhiteHuman extends AbstractWhiteHuman {
@Override
public void getSex() {
System.out.println("白人男性");
}
}
public class FemaleWhiteHuman extends AbstractWhiteHuman {
@Override
public void getSex() {
System.out.println("白人女性");
}
}
public class MaleBlackHuman extends AbstractBlackHuman {
@Override
public void getSex() {
System.out.println("黑人男性");
}
}
public class FemaleBlackHuman extends AbstractBlackHuman {
@Override
public void getSex() {
System.out.println("黑人女性");
}
}
生产产品族下产品的工厂
public interface IHumanFactory {
/**
* 制造一个黄种人
*
* @return 黄种人
*/
Human createYellowHuman();
/**
* 制造一个白种人
*
* @return 白种人
*/
Human createWhiteHuman();
/**
* 制造一个黑种人
*
* @return 黑种人
*/
Human createBlackHuman();
}
/**
* 生产男人的工厂
*/
public class FemaleFactory implements IHumanFactory {
@Override
public Human createYellowHuman() {
return new FemaleYellowHuman();
}
@Override
public Human createWhiteHuman() {
return new FemaleWhiteHuman();
}
@Override
public Human createBlackHuman() {
return new FemaleBlackHuman();
}
}
/**
* 生产女人的工厂
*/
public class MaleFactory implements IHumanFactory {
@Override
public Human createYellowHuman() {
return new MaleYellowHuman();
}
@Override
public Human createWhiteHuman() {
return new MaleWhiteHuman();
}
@Override
public Human createBlackHuman() {
return new MaleBlackHuman();
}
}
抽象工厂
/**
* 抽象工厂
*/
public abstract class AbstractHumanFactoryFactory{
public abstract <T extends IHumanFactory> T createHumanFactory(Class<T> c);
}
public class HumanFactory extends AbstractHumanFactoryFactory{
@Override
public <T extends IHumanFactory> T createHumanFactory(Class<T> c) {
T humanFactory = null;
try {
Constructor<T> constructor = c.getConstructor();
humanFactory = constructor.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return humanFactory;
}
}
入口类
public class AbstractFactoryMain {
public static void main(String[] args) {
AbstractHumanFactoryFactory humanFactory = new HumanFactory();
FemaleFactory femaleFactory = humanFactory.createHumanFactory(FemaleFactory.class);
MaleFactory maleFactory = humanFactory.createHumanFactory(MaleFactory.class);
System.out.println("-----生产一些女性-----");
Human yellowFemale = femaleFactory.createYellowHuman();
yellowFemale.getColor();
yellowFemale.talk();
yellowFemale.getSex();
System.out.println("-----生产一些男性-----");
Human yellowMale = maleFactory.createYellowHuman();
yellowMale.getColor();
yellowMale.talk();
yellowMale.getSex();
}
}