工厂方法模式的困惑

dlhansy 2015-07-24 09:52:43
简单工厂模式可以理解,把创建某一类产品的过程封装到工厂类的一个方法中,通过条件分支创建不同的具体产品。
但是工厂方法每一个产品产品类对应一个工厂类,创建产品需要先创建对应的工厂类。
这样做好处是什么?如何创建不同的具体工厂呢?还是用条件分支?
...全文
177 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
落落叶叶无声 2015-07-27
  • 打赏
  • 举报
回复
抽象工厂模式: 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要解决:主要解决接口选择的问题。 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。 如何解决:在一个产品族里面,定义多个产品。 关键代码:在一个工厂里聚合多个同类产品。 应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。 使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。 注意事项:产品族难扩展,产品等级易扩展。
dlhansy 2015-07-27
  • 打赏
  • 举报
回复
请大神帮帮忙,多谢啦。
dlhansy 2015-07-24
  • 打赏
  • 举报
回复
可能是我没说清楚,几个例子: 工厂抽象类:

public abstract class SenderFactory {
	public abstract Sender createSender();
}
Email工厂类:

public class EmailSenderFactory extends SenderFactory {

	@Override
	public Sender createSender() {
		return new EmailSender();
	}
}
其他工厂类省略 产品是发送器,发送器抽象类:

public interface Sender {
	void sendMsg(String msg);
}
Email发送器:

public class EmailSender implements Sender {

	@Override
	public void sendMsg(String msg) {
		System.out.println("email send work:" + msg);
	}

}
学生类:

public class Student {
	public void sendMsg(SenderFactory factory, String msg) {
		factory.createSender().sendMsg(msg);
	}
}
客户端类:

public class Main {
	public static void main(String[] args) {
		Student student = new Student();
		student.sendMsg(new EmailSenderFactory(), "Java");
		student.sendMsg(new SmsSenderFactory(), "C++");
	}
}

客户端具体操作时还是面临选择哪个发送工厂的问题,与使用简单工厂模式时面临选择哪个Sender是一样的。 使用工厂方法有什么好处呢?
飏飏一蝶 2015-07-24
  • 打赏
  • 举报
回复
根据实际需求,既然是子类当然是在父类基础上的具体化。
dlhansy 2015-07-24
  • 打赏
  • 举报
回复
谢谢回复,还有问题请教: 创建具体产品之前需要创建该产品的工厂类是吧,这是如何创建的呢?根据什么创建不同的具体工厂类?
飏飏一蝶 2015-07-24
  • 打赏
  • 举报
回复
工厂方法是在抽象工厂类中实现了获取对象的接口,由子类来延迟实现。继承抽象工厂类并实现工厂方法,这样做可以对于未来所有未知的子类产品提供接口。个人理解。不要条件分支,一般简单工厂模式才用。
相关推荐
发帖
Java

4.9w+

社区成员

Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
帖子事件
创建了帖子
2015-07-24 09:52
社区公告
暂无公告