package com.cheng.zenofdesignpatterns.patterns.abstractfactory;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.common.AbstractCreator;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.common.AbstractProductA;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.common.AbstractProductB;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.common.Creator1;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.common.Creator2;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.nvwa.AndrogyneFactory;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.nvwa.FemaleFactory;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.nvwa.Human;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.nvwa.HumanFactory;
import com.cheng.zenofdesignpatterns.patterns.abstractfactory.nvwa.MaleFactory;
public class ZoDPAbstractFactoryActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("抽象工厂模式");
String content = "定义:\n" +
"Provide an interface for creating families of related or dependent " +
"objects without specifying their concrete classes.\n" +
"为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。\n\n" +
"抽象工厂模式的优点\n" +
"- 封装性\n" +
"每个产品的实现类不是高层模块要关心的,它要关心的是接口,是抽象,它不关心对象" +
"是如何创建出来,这由谁负责呢?工厂类,只要知道工厂类是谁,我就能创建出一个需" +
"要的对象,省时省力,优秀的设计就应该如此。\n" +
"- 产品族内的约束为非公开状态\n" +
"例如生产产品比例的问题上,具体的产品族内的约束是在工厂内实现的,这样的生产过" +
"程对调用工厂类的高层模块来说是透明的,它不需要知道这个约束。\n" +
"抽象工厂模式的缺点\n" +
"最大缺点就是产品族扩展非常困难\n\n" +
"使用场景\n" +
"一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。" +
"什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是*nix下的文本" +
"编辑器和Windows下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片" +
"处理器也有类似情况。也就是具有了共同的约束条件:操作系统类型。于是我们可以使用" +
"抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。\n\n" +
"注意事项\n" +
"抽象工厂模式的缺点是产品族扩展比较困难,但是一定要清楚,是产品族扩展困难,而不" +
"是产品等级。在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一" +
"个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展困难。" +
"以人类为例子,产品等级中只有男、女两个性别,现实世界还有一种性别:双性人,那我" +
"们要扩展这个产品等级也是非常容易的,增加三个产品类,分别对应不同的肤色,然后再" +
"创建一个工厂类,专门负责不同肤色的双性人的创建任务,完全通过扩展来实现需求的变" +
"更,从这一点上看,抽象工厂模式是符合开闭原则的。\n\n" +
"最佳实践\n" +
"抽象工厂模式是一个简单的模式,使用的场景非常多,大家在软件产品开发过程中,涉及不" +
"同操作系统的时候,都可以考虑使用抽象工厂模式,例如一个应用,需要在三个不同平台(" +
"Windows、Linux、Android)上运行,可以通过抽象工厂模式屏蔽掉操作系统对应用的影响。" +
"三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似的,唯一不同的是调用不同" +
"的工厂方法,由不同的产品类去处理与操作系统交互的信息。";
mContentTV.setText(content);
}
@Override
public void onClick(View v) {
// 1. 模拟女娲造人
// 第一条生产线,男性生产线
HumanFactory maleHumanFactory = new MaleFactory();
// 第二条生产线,女性生产线
HumanFactory femaleHumanFactory = new FemaleFactory();
// 生产线建立完毕,开始生产人了
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
System.out.println("--生产一个黄色女性--");
femaleYellowHuman.getColor();
femaleYellowHuman.talk();
femaleYellowHuman.getSex();
System.out.println("--生产一个黄色男性--");
maleYellowHuman.getColor();
maleYellowHuman.talk();
maleYellowHuman.getSex();
Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();
Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();
System.out.println("--生产一个白色女性--");
femaleWhiteHuman.getColor();
femaleWhiteHuman.talk();
femaleWhiteHuman.getSex();
System.out.println("--生产一个白色男性--");
maleWhiteHuman.getColor();
maleWhiteHuman.talk();
maleWhiteHuman.getSex();
Human maleBlackHuman = maleHumanFactory.createBlackHuman();
Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();
System.out.println("--生产一个黑色女性--");
femaleBlackHuman.getColor();
femaleBlackHuman.talk();
femaleBlackHuman.getSex();
System.out.println("--生产一个黑色男性--");
maleBlackHuman.getColor();
maleBlackHuman.talk();
maleBlackHuman.getSex();
// 2. 抽象工厂模式的通用写法演示
// 定义出两个工厂
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
// 产生A1对象
AbstractProductA a1 = creator1.createProductA();
//产生A2对象
AbstractProductA a2 = creator2.createProductA();
//产生B1对象
AbstractProductB b1 = creator1.createProductB();
//产生B2对象
AbstractProductB b2 = creator2.createProductB();
a1.shareMethod();
a1.doSomething();
a2.shareMethod();
a2.doSomething();
b1.shareMethod();
b1.doSomething();
b1.shareMethod();
b2.doSomething();
// 3. 模拟女娲造人 -- 扩展一个双性人
// 生产线,双性人生产线
HumanFactory androgyneHumanFactory = new AndrogyneFactory();
// 生产线建立完毕,开始生产人了
Human androgyneYellowHuman = androgyneHumanFactory.createYellowHuman();
Human androgyneWhiteHuman = androgyneHumanFactory.createWhiteHuman();
Human androgyneBlackHuman = androgyneHumanFactory.createBlackHuman();
System.out.println("--生产一个黄色双性人--");
androgyneYellowHuman.getColor();
androgyneYellowHuman.talk();
androgyneYellowHuman.getSex();
System.out.println("--生产一个白色双性人--");
androgyneWhiteHuman.getColor();
androgyneWhiteHuman.talk();
androgyneWhiteHuman.getSex();
System.out.println("--生产一个黑色双性人--");
androgyneBlackHuman.getColor();
androgyneBlackHuman.talk();
androgyneBlackHuman.getSex();
}
}