简单工厂模式一般涉及到哪些对象,这些对象的作用是什么?

2025-02-24 09:38:47
推荐回答(2个)
回答1:

你好 你问的这个问题 我感觉貌似问得有点晦涩
如果你想了解简单工厂是什么的话 我今天刚刚好学习了简单工厂 ,在这里我说说下我目前对简单工厂的了解 当做我们学习的交流(观点不一定正确,提供学习交流)

简单工厂是根据客户的需要来创建具体的产品,从而使客户和具体产品之间实现松耦合(也就是说客户不需要关系产品是如何创建的,只需要告诉工厂需要什么产品,便可获得。)

如果这里一定要说设计到哪些对象,这些对象的作用是什么的话。那我们可以从 Head FIrst那本书或者 大话设计模式中简单工厂的图中看出:
需要有一个产品接口或者父类(所有具体产品必须实现或者继承它,作用是可以用于实现多态)。
需要具体的产品类(一个或多个,也可以认为是产品族,作用就是要创建的具体产品)
需要一个工厂类(作用就是根据客户的需求创建相应的具体产品,然后返回给客户,但这里返回类型是接口类型或者父类)

下面是我自己写的一段学习笔记,仅提供参考
简单工厂严格来说他并不是一种设计模式,更偏向于一种编程习惯。当我们还是一个刚刚入门的程序员的时候,我很习惯开始接触面向对象编程时,
如果我们想描述一种东西,如苹果的话,就定义一个苹果的类,苹果有红色皮,有子还有XXXX等等的属性。
而我们实例化苹果的时候就会写着Apple apple = new Apple();
然后有些人就会想到 我们既然学了苹果类 苹果可以这样写 那梨、香蕉、葡萄等都可以这样写。
然后就会延伸到果园。
一个果园里面有很多水果 我们可以在果园里吃我们想吃的水果。
那我们就会在人的类里面写一个吃水果的方法
public void EatFruit(String fruit)
{
if(fruit.Equals("Apple"))
{
Apple a = new Apple();
a.xxxx();
}else if(fruit.Equals("Pear"))
{
Pear p = new Pear();
}
}

当自己慢慢对OO熟悉后 发现这样代码不好,所以稍作改善

定义了一个Fruit的类 所有的 水果都集成Fruit类,代码就改写为
public void EatFruit(String fruit)
{
Fruit f ;
if(fruit.Equals("Apple"))
{
f = new Apple();
}else if(fruit.Equals("Pear"))
{
f = new Pear();
}
}

如果增加了2-3种水果 而且不只人吃水果 野猪、鸟、虫子都会吃水果。
那么 我们是不是要在N种类里面都要修改 吃水果这个方法 这样子违背了开闭原则。
所以 这里就是简单工厂登场的时候了
简单工厂 定义了一个水果的父类 所有的具体水果都继承于父类。然后有一个叫做Factory的工厂专门用于创建具体的产品。
比如这里有一个果园工厂,专门用来生产具体水果
public class GradenFactory
{
public Fruit CreateApple()
{
Fruirt f = new Apple();
}

public Fruit CreatePear()
{
Fruirt f = new Pear();
}
}
这样就算增加了 其他的水果类 也只修改一处。
优点:1.把具体产品的创建任务交给工厂来做,客户不需要具体的创建过程,只关系从工厂获取到的产品。实现客户与具体产品间的松耦合。
2.如有新增产品的时候,减少了代码的改动。

缺点:1.什么事情都交给工厂来做,感觉工厂负责的事情太多了。这样貌似很不好。(还是无法表达)

工厂方法的引入:
果园地方是有限的
但是果农想吃什么就种什么 起初地方还比较宽敞 所以开始没什么感觉
到后来 因为品种繁多 种地开始出现缺乏 这时候 果农就考虑 应该想办法 不能什么水果都在这个果园里种
后来想到一个办法 就是什么水果应该开设什么样的果园 比如橘子园 这样管理方便 生产效率也高
这里就出现了 工厂方法

以上的言词和表达都不怎么严谨 请勿见怪
顺便邀请大伙一起学习:
如果你喜欢或者有意向于WPF、Silverlight、WP7 请加入18724445(WPF爱好者社区)
在本社区中主要讨论WPF Silverlight WP7 如果你有兴趣也可以讨论下设计模式 架构方面的一些话题
如果你对这方面有着浓厚的兴趣 不妨加入到我们的社区 跟大家一起学习。。。

回答2:

工厂模式都涉及到2个基本元素:工厂(factory)和产品(product)。
factory的任务就是创建某一类product,product是你程序真正需要的对象,但它不通过new关键字获得,而通过一个factory的创建接口(一般名字叫做createXXX()),这样做的好处是对象的创建与对象的使用相分离,降低了对具体产品对象的依赖。
工厂模式有好几种变体,在比较简单的情况下,可以把工厂的创建方法做成static的,这种做法很通俗也很常见;如果需要同时创建几种产品形成一个产品簇(head first design pattern上的叫法),可以将每一种产品都作为工厂的一个方法,工厂抽象成接口,这时产品的创建就分为2步,先确定工厂的类型,一旦工厂类型确定下来,工厂所生产的产品也就确定了,这种方式叫做抽象工厂。
说起来比较抽象,推荐你看一下head first那本设计模式,其实意思比较浅显的。