惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Attack and Defense Labs
Attack and Defense Labs
V2EX - 技术
V2EX - 技术
O
OpenAI News
S
Secure Thoughts
H
Heimdal Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Schneier on Security
Schneier on Security
H
Hacker News: Front Page
S
Security Affairs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
The Register - Security
The Register - Security
GbyAI
GbyAI
Cloudbric
Cloudbric
MongoDB | Blog
MongoDB | Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
Forbes - Security
Forbes - Security
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
Hacker News - Newest:
Hacker News - Newest: "LLM"
The Cloudflare Blog
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
Webroot Blog
Webroot Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog
T
Tor Project blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Hacker News: Ask HN
Hacker News: Ask HN
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
V
V2EX
T
Tailwind CSS Blog
SecWiki News
SecWiki News
NISL@THU
NISL@THU
C
Check Point Blog

博客园 - 流云之心

招人啦 - 前端,后台开发专家 为什么不给程序员配好电脑 [翻译] SQL Server中对XML操作 开发常用小工具介绍 强制休息程序 - EyeGuardian 眼睛守护者 Beta测试版 定时计划任务方案比较以及通过脚本创建计划任务(SchTasks命令) javascript 将页面上的Table导出保存为Excel (无格式) - 流云之心 Excel Programming (C# + VBA) Part III Excel Programming (C# + VBA) Part II Excel programming (C# + VBA) Part 1 Harry Potter - The Half-Blood Prince 转移阵地了,新地址:http://spaces.msn.com/members/PuGong 关于XMLHTTP object的OPEN方法 smart client优势在那里? (草稿) SQL Server的collation问题 Microsoft Interview Question links 转自http://blogs.msdn.com/chappell/archive/2004/07/20/189364.aspx MSN to expand free e-mail storage to 250MB 用 #inculde file = "../fiel" 报1031错误 用<!--include file = ../ --> 报错误1031
设计模式一 - Simple Factory, Factory Method, Abstract Factory以及Builder模式简述
流云之心 · 2010-02-01 · via 博客园 - 流云之心

虽然现在博客园上关于设计模式的文章已经有很多,但还是写一篇来凑下热闹,也算是对自己多这几种模式得使用总结。

Factory Pattern 工厂模式和 Builder Patter 建造者模式都是通过定义接口来将类的定义和实现区分开来。下面一步一步来做说明

1. Simple Factory 简单工厂

 简单工厂只是将类简单抽象化,以Pizza为例,我们定义好Pizza的接口,实现继承Pizza的类PizzaA和PizzaB,然后简单工厂提供方法根据传进来的参数类型确定像调用者返回PizzaA或者PizzaB的实例

代码

    public interface Pizza
    {
        
void DoPizza();
    }
public class PizzaA : Pizza
    {
        
public void DoPizza()
        {
            Console.WriteLine(
"pizza A");
        }
    }
public class PizzaB : Pizza
    {
        
public void DoPizza()
        {
            Console.WriteLine(
"pizza B");
        }
    }
   
public static class SimplePizzaFacotry
    {
        
public static Pizza Create(string type)
        {
            
if (type == "PizzaA")
                
return new PizzaA();
            
else
                
return new PizzaB();
        }
    }
// Usage
    public class SimplePizzaFacotryOrder
    {
        
public void OrderPizza()
        {
            Pizza pizza 
= SimplePizzaFacotry.Create("PizzaA");
            pizza.DoPizza();
        }
    }

2. Factory Method工厂方法 

工厂方式是在简单工厂模式基础上进一步抽象来符合OO设计的要求。这里将Factory抽象化为接口或抽象类,然后继承类负责具体实现。此时增加一个FactoryManage来负责返回那个工厂类实现的实例。代码示例如下 

代码

// Pizza, PizzaA, PizzaB继续使用简单工厂定义

    
public abstract class PizzaFactory
    {
        
public abstract Pizza Create();
    }
public class PizzaAFactory : PizzaFactory
    {
        
public override Pizza Create()
        {
            
return new PizzaA();
            
//throw new NotImplementedException();
        }
    }
public class PizzaBFactory : PizzaFactory
    {
        
public override Pizza Create()
        {
            
return new PizzaB();
            
//throw new NotImplementedException();
        }
    }
public abstract class PizzaMethodManager
    {
        
public static PizzaFactory Factory = new PizzaAFactory();
    }
    
    
//usage 
    public class FactoryMethodPizzaOrder
    {
        
public FactoryMethodPizzaOrder()
        {
            Pizza pizza 
= PizzaMethodManager.Factory.Create();
        }
    }

  3. Abstract Factory 抽象工厂

 抽象工厂和工厂方法基本上一样,区别在于此时抽象工厂可以来实现一系列相关类的实现。继续用Pizza举例,这里将Pizza分为Dough和Sauce即面团和酱,然后定义HutPizza和PapaPizza的面团Dougn, Sauce以及Pizza的实现。示例如下

代码

    public interface IDough
    {
       
void DoDough();
    }
public interface ISauce
    {
        
void DoSauce();
    }
public class PapaDough : IDough
    {
        
public void DoDough()
        {
            Console.WriteLine(
"Papa Jone's Dough");
        }
    }
public class PapaSource : ISauce
    {
        
public void DoSauce()
        {
            Console.WriteLine(
"Papa Jone's Sauce");
        }
    }
public class HutDough : IDough
    {
        
public void DoDough()
        {
            Console.WriteLine(
"Pizza Hut's Dough");
        }
    }
public class HutSource : ISauce
    {
        
public void DoSauce()
        {
            Console.WriteLine(
"Pizza Hut's Sauce");
        }
    }
public interface IPizzaFactory
    {
        IDough PrepareDough();
        ISauce AddSauce();
    }
public class PapaPizzaFacotry : IPizzaFactory
    {
        
public IDough PrepareDough()
        {
            
return new PapaDough();
        }
public ISauce AddSauce()
        {
            
return new PapaSource();
        }
    }
public class HutPizzaFacotry : IPizzaFactory
    {
        
public IDough PrepareDough()
        {
            
return new HutDough();
        }
public ISauce AddSauce()
        {
            
return new HutSource();
        }
    }
public abstract class AbstractPizzaManager
    {
        
public static IPizzaFactory Facotry = new PapaPizzaFacotry();
    }
// Usage
    public class OrderPizzaAbstract
    {
        
public void OrderPizza()
        {
            IDough dough 
= AbstractPizzaManager.Facotry.PrepareDough();
            ISauce sauce 
= AbstractPizzaManager.Facotry.AddSauce();
            dough.DoDough();
            sauce.DoSauce();
        }
    }

 4. Builder Pattern 建造者模式

 Builder和抽象工厂类似,也是建立一系列对象的实现。区别在于Builder建立的一对象有依赖关系而Factory的对象只是有关联。依旧以Pizza为例,pizza的做法是先做面团(饼底),然后放Sauce(Cheese或者其他的东西),然后放Topping(火腿,香肠之类的)。举例如下

代码

    class PizzaBD
    {
        
public string Dough { getset; }
        
public string Sauce { getset; }
        
public string Topping { getset; }
    }
     
    
abstract class PizzaBuilder
    {
        
public PizzaBD pizza { getprotected set; }
     
        
public void CreatePizza()
        {
            pizza 
= new PizzaBD();
        }
     
        
public abstract void BuildDough();
        
public abstract void BuildSauce();
        
public abstract void BuildTopping();
    }
     
    
class HawaiianPizzaBuilder : PizzaBuilder
    {
        
public override void  BuildDough()
        {
            pizza.Dough 
= "Cross";
        }
     
        
public override void BuildSauce()
        {
            pizza.Sauce 
= "Mild";
        }
     
        
public override void BuildTopping()
        {
            pizza.Topping 
= "Ham+Pineapple";
        }
    }
     
    
class SpicyPizzaBuilder : PizzaBuilder
    {
        
public override void BuildDough()
        {
            pizza.Dough 
= "Pan Baked";
        }
     
        
public override void BuildSauce()
        {
            pizza.Sauce 
= "Hot";
        }
     
        
public override void BuildTopping()
        {
            pizza.Topping 
= "Pepperoni+Salami";
        }
    }
     
    
class Cook
    {
        
public PizzaBuilder PizzaBuilder { getset; }public PizzaBD Pizza { get { return PizzaBuilder.pizza; } }
     
        
public void MakePizza()
        {
            PizzaBuilder.CreatePizza();
            PizzaBuilder.BuildDough();
            PizzaBuilder.BuildSauce();
            PizzaBuilder.BuildTopping();
        }
    }
     
    
// usage 
    public class CallBuilder
    {
        
public void OrderPizza()
        {
            Cook cook 
= new Cook();
            cook.PizzaBuilder 
= new SpicyPizzaBuilder();
            cook.MakePizza();
            cook.PizzaBuilder 
= new HawaiianPizzaBuilder();
            cook.MakePizza();
        }
    }

  5. Facade Pattern 外观模式

 提到了Builder模式,也就顺便提一下Facade模式。两者类似处在于都是建立一系列对象,区别在于Builder模式创建一系列有依赖关系的子类,而Facade模式则是建立一个将复杂的子类简化和集中化的通道。还是以Pizza为例,客户吃完付款,需要Waiter收取现金/卡,然后财务做账/transfer之后打印发票,返回。对客户来说后端多的一系列动作他并不关心,PizzaPayFacade提供给客户一个Pay方法,方法里面完成这一系列的动作[可能包括类的实现]。代码稍后提供。大家可以先参考First We try, then we trust的Facade说明的代码示例 http://www.cnblogs.com/zhenyulu/articles/55992.html