package com.cheng.zenofdesignpatterns.patterns.factorymethod;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.common.ConcreteCreator;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.common.ConcreteProduct1;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.common.ConcreteProduct2;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.common.Creator;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.common.Product;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.lazyinitialization.LazyProductFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.multi.BlackHumanFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.multi.WhiteHumanFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.multi.YellowHumanFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.nvwa.AbstractHumanFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.nvwa.BlackHuman;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.nvwa.Human;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.nvwa.HumanFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.nvwa.WhiteHuman;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.nvwa.YellowHuman;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.replacesingleton.Singleton;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.replacesingleton.SingletonFactory;
import com.cheng.zenofdesignpatterns.patterns.factorymethod.simple.SimpleHumanFactory;
public class ZoDPFactoryMethodActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("工厂方法模式");
String content = "定义:\n" +
"Define an interface for creating an object,but let subclasses decide " +
"which class to instantiate.Factory Method lets a class defer instantiation " +
"to subclasses.\n" +
"定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化" +
"延迟到其子类。\n\n" +
"工厂方法模式的优点\n" +
"- 首先,良好的封装性,代码结构清晰\n" +
"- 其次,工厂方法模式的扩展性非常优秀\n" +
"- 再次,屏蔽产品类\n" +
"- 最后,工厂方法模式是典型的解耦框架\n" +
"高层模块只需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我不需" +
"要的就不要去交流;也符合依赖倒置原则,只依赖产品类的抽象;当然也符合里氏替换原" +
"则,使用产品子类替换产品父类,没问题。\n\n" +
"使用场景\n" +
"- 首先,工厂方法模式是new一个对象的替代品\n" +
"在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行" +
"管理,增加代码的复杂度。\n" +
"- 其次,需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式\n" +
"- 再次,工厂方法模式可以用在异构项目中\n" +
"- 最后,可以使用在测试驱动开发的框架下(现在可以直接考虑使用JMock或EasyMock)\n\n" +
"工厂方法模式的扩展\n" +
"1. 缩小为简单工厂模式\n" +
"2. 升级为多个工厂\n" +
"3. 代替单例模式\n" +
"4. 延迟初始化\n\n" +
"最佳实践\n" +
"该模式几乎尽人皆知,但不是每个人都能用得好。熟能生巧,熟练掌握该模式,多思考工厂" +
"方法如何应用,而且工厂方法模式还可以与其他模式混合使用(例如模板方法模式、单例模" +
"式、原型模式等),变化出无穷的优秀设计。";
mContentTV.setText(content);
}
@Override
public void onClick(View v) {
// 1. 模拟女娲造人
// 声明阴阳八卦炉
AbstractHumanFactory yinYanLv = new HumanFactory();
// 女娲第一次造人,火候不足,于是白人产生了
System.out.println("--造出的第一批人是白色人种--");
Human whiteHuman = yinYanLv.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();
// 女娲第二次造人,火候过足,于是黑人产生了
System.out.println("--造出的第二批人是黑色人种--");
Human blackHuman = yinYanLv.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
// 女娲第三次造人,火候刚刚好,于是黄色人种产生了
System.out.println("--造出的第三批人是黄色人种--");
Human yellowHuman = yinYanLv.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
// 2. 通用工厂方法模式演示
Creator creator = new ConcreteCreator();
Product product1 = creator.createProduct(ConcreteProduct1.class);
Product product2 = creator.createProduct(ConcreteProduct2.class);
product1.method1();
product1.method2();
product2.method1();
product2.method2();
// 3. 简单工厂模式演示
System.out.println("--造出的第一批人是白色人种--");
Human whiteHuman1 = SimpleHumanFactory.createHuman(WhiteHuman.class);
whiteHuman1.getColor();
whiteHuman1.talk();
System.out.println("--造出的第二批人是黑色人种--");
Human blackHuman1 = SimpleHumanFactory.createHuman(BlackHuman.class);
blackHuman1.getColor();
blackHuman1.talk();
System.out.println("--造出的第三批人是黄色人种--");
Human yellowHuman1 = SimpleHumanFactory.createHuman(YellowHuman.class);
yellowHuman1.getColor();
yellowHuman1.talk();
// 4. 多个工厂类演示
System.out.println("--造出的第一批人是白色人种--");
Human whiteHuman2 = new WhiteHumanFactory().createHuman();
whiteHuman2.getColor();
whiteHuman2.talk();
System.out.println("--造出的第二批人是黑色人种--");
Human blackHuman2 = new BlackHumanFactory().createHuman();
blackHuman2.getColor();
blackHuman2.talk();
System.out.println("--造出的第三批人是黄色人种--");
Human yellowHuman2 = new YellowHumanFactory().createHuman();
yellowHuman2.getColor();
yellowHuman2.talk();
// 5. 替代单例模式
Singleton singleton = SingletonFactory.getSingleton();
singleton.doSomething();
// 6. 延迟初始化
Product product21 = LazyProductFactory.createProduct("Product1");
Product product22 = LazyProductFactory.createProduct("Product2");
product21.method1();
product21.method2();
product22.method1();
product22.method2();
}
}