/*【简单工厂模式】
*生活中的工厂就是生产产品,而设计模式中工厂是用来生产对象;
*简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例;
*简单工厂模式是工厂模式家族中最简单实用的模式;
*/
// =========客户端==========
public class NoFactoryDemo {
public static void main(String args[]) {
ClothDoll cd = new ClothDoll();
System.out.println(cd.getInfo());
BabieDoll bd = new BabieDoll();
System.out.println(bd.getInfo());
}
}
// ==========工厂端==========
// 布娃娃
class ClothDoll {
public String getInfo() {
return "我是布娃娃,我怕脏!";
}
}
// 芭比娃娃
class BabieDoll {
public String getInfo() {
return "我是芭比娃娃,我很漂亮";
}
}
/*
* 思考:用面向对象的思维思考这个问题, NoFactoryDemo()为调用者(客户端), ClothDoll()为被调用者(服务器端),
* 客户端直接依赖于服务器端,高耦合性!===========BE CAREFUL========若布娃娃不生产了,生产其他销量好的产品,则客户在new
* ClothDoll()时就会出问题!客户和工厂的产品具有直接依赖关系,代码耦合性太高,柔韧性不强!!!为了解决这个问题引入了工厂模式!
* 工厂模式作用:解耦!!
*/
// =========客户端==========
public class FactoryDemo {
public static void main(String args[]) {
Doll cd = DollFactory.getInstance("LL");
Doll ba = DollFactory.getInstance("cloth");
if (cd != null) {
System.out.println(cd.getInfo());
}
if (ba != null) {
System.out.println(ba.getInfo());
}
}
}
// ==========工厂端==========
// 布娃娃
class ClothDoll implements Doll {
public String getInfo() {
return "我是布娃娃,我怕脏!";
}
}
// 芭比娃娃
class BabieDoll implements Doll {
public String getInfo() {
return "我是芭比娃娃,我很漂亮";
}
}
// 首先将产品抽象到顶层产品接口
interface Doll {
public abstract String getInfo();
}
// 工厂类;通过工厂模式,使客户依赖于工厂类,而不依赖于产品类
class DollFactory {
// 该工厂类只负责生产对象,根据条件不同生产不同对象
public static Doll getInstance(String name) {
if (name.equals("cloth")) {
return new ClothDoll();
} else if (name.equals("babie")) {
return new BabieDoll();
} else {
System.out.println("没有该产品!!!");
return null;
}
}
}
/*
* 分析: 这样的目的是客户端不会直接用到产品这个对象,若产品发生变化,客户不受影响,
* 加入工厂模式类,该类只负责生产对象,将这个类通过条件判断生产的是什么产品,去生产不同的对象!
* 客户端没有用到new对象,而是与“工厂类”和“接口”进行依赖,降低了与产品的耦合性,
* 这样如果产品发生更改,只需修改服务器端类即可,不用更改客户端!!(转移依赖关系)
* 也体现了OO设计原则: 面向接口编程!!!增强了程序的可扩展性!!!
*/