(一)简单工厂模式

(一)简单工厂模式

作者:林子
时间:2014年8月
出处:http://blog.csdn.net/u013011841
声明:欢迎指出错误


1、为什么学习设计模式?

       设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

2、为什么第一个学习简单工厂?

      简单工厂(Simple Factory)是类的创建者,又叫静态工厂方法(Static Factory Method)。简单工厂是由一个工厂对象决定创建出纳一种产品类的实例。第一个学习简单工厂是因为这是最基本的创建模式,学习好简单工厂有利于我们学好工厂方法。

 

3、简单工厂的引进

我们以农场公司为例子,专门向市场销售各类水果。在这个系统里面需要描述下列水果

  • 葡萄Grape
  • 草莓Strawberry
  • 苹果Apple

水果和其他的植物有很大的不同,水果最终是可以食用的。那么一个自然的做法就是就是建立一个各种水果都适用的接口,以便和农场里的其他植物区分开来。


水果的接口(interface)规定所有的水果必须实现的接口,包括任何水果必须具备的方法。

PS: 不知道什么是接口的去看Java教材,接口就是Fruit的抽象方法,类似C++的虚函数

 

水果接口的源代码:


Public interface Fruit
{
   //生长
   void grow();

   //收获
   void harvest();

   //种植
   void plant();
}

描述苹果类的类图如下



Apple类是水果类的一种,因此它实现了水果接口所声明的所有方法。另外,由于苹果是多年生的植物,因此多出一个treeAge性质,用来描述苹果树的年龄。


public class Apple implements Fruit
{
   private int treeAge;

   //生长
   public void grow()
   {
       log(“Apple if growing...”);
   }

   //收获
   public void harvest()
   {
       log(“Apple has been harvest.”)
   }

   //种植
   public void plant()
   {
       log(“Apple has been planted.”)
   }

   //辅助方法
   public static log(String msg)
   {
       System.out.println(msg);
   }

   //树龄取值方法
   public int getTreeAge()
   {
       return treeAge;
   }

   //树龄的赋值方法
   public int setTreeAge(int treeAge)
   {
       this.treeAge=treeAge;
   }

}

葡萄和草莓类和苹果类类似,这里就不一一给出了。

 

农场的园丁(在这里作为简单工厂)也是系统的一部分,自然要由一个合适的类来代表。这个类就是FruitGardener类,其结构如图所示




FruitGardener会根据客户端的要求,创建出不同的水果对象,如苹果(Apple).

园丁类的代码如下


public class FruitGardener
{
//简单工厂
   public static Fruit factory(String which)
   {
      if(which.equalsIgnoreCase(“Apple”))
      {
          return new Apple;
      }
      if(which.equalsIgnoreCase(“strawberry”))
      {
         return new strawberry;
      }

      if(which.equalsIgnoreCase(“grape”))
      {
        return new grape;
      } 

   }
}

4、简单工厂的结构

简单工厂涉及到工厂角色、抽象产品角色和具体产品角色等三个角色:

  • 工厂类(Creator):担任这个角色的是简单工厂的核心,含有与应用紧密相关的逻辑,工厂类在调用下创建产品对象。
  • 抽象产品(Product):担任这个角色的类是由简单工厂所创建的对象的父类,或者他们拥有共同的接口。
  • 具体产品(Concrete Product):简单工厂所创建的任何对象都是这个角色的实例。


工厂类源代码


public class Creator
{
   //简单工厂
   public static Product factory()
   {
       return new ConcreteProduct();
   }
}

抽象产品源代码


public interface Product 
{
}

具体产品


public class ConcreteProduct implements Product
{
   public ConcreteProduct(){}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的工厂模式示例: 假设有一个披萨店,可以制作不同种类的披萨,例如芝士披萨、蘑菇披萨等等。我们可以使用简单工厂模式来创建这些披萨。 首先,我们需要创建一个披萨类,例如: ```python class Pizza: def prepare(self): pass def bake(self): pass def cut(self): pass def box(self): pass ``` 接下来,我们可以创建不同种类的披萨类,例如芝士披萨类和蘑菇披萨类: ```python class CheesePizza(Pizza): def prepare(self): print("Preparing Cheese Pizza") def bake(self): print("Baking Cheese Pizza") def cut(self): print("Cutting Cheese Pizza") def box(self): print("Boxing Cheese Pizza") class MushroomPizza(Pizza): def prepare(self): print("Preparing Mushroom Pizza") def bake(self): print("Baking Mushroom Pizza") def cut(self): print("Cutting Mushroom Pizza") def box(self): print("Boxing Mushroom Pizza") ``` 然后,我们创建一个简单的披萨工厂类,用于根据不同的披萨类型创建披萨对象: ```python class SimplePizzaFactory: def create_pizza(self, pizza_type): if pizza_type == "cheese": return CheesePizza() elif pizza_type == "mushroom": return MushroomPizza() else: return None ``` 最后,我们可以在披萨店中使用这个工厂类来制作披萨: ```python class PizzaStore: def __init__(self, factory): self.factory = factory def order_pizza(self, pizza_type): pizza = self.factory.create_pizza(pizza_type) if pizza: pizza.prepare() pizza.bake() pizza.cut() pizza.box() else: print("Sorry, we don't have this type of pizza.") ``` 这样,我们就可以使用简单工厂模式来创建不同种类的披萨了。我们只需要在创建披萨店时指定使用哪个工厂,就可以根据工厂创建相应的披萨对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值