最常见的结构设计商业模式
结构设计商业模式一般来说是对某两类的应用软件合作开发问题的可宠信的应用软件系统,将结构设计商业模式导入应用软件合作开发和合作开发过程,其目地就是要充分运用已近的应用软件合作开发实战经验。
最常见的结构设计商业模式根据我的实战经验我把我时常见到的结构设计商业模式在这里做个归纳,依照我的实战经验,它的次序如下表所示:1)easier商业模式、2)抽象化厂房商业模式和厂房商业模式、3)转接器商业模式、4)点缀商业模式、5)观测者商业模式、6)外形商业模式 其他商业模式目前还极少加进。
easier商业模式
这是用的最多的商业模式,每两个正式宣布的应用软件都要用它,自上而下实用性、惟一天然资源、还有两个就是所有的厂房我都结构设计为easier商业模式,因此它的使用率小于厂房商业模式和抽象化厂房商业模式之和。是用以建立两个须要自上而下惟一示例的商业模式。只是须要纠偏一点儿。singleton商业模式中,缺省应该是protected.这种常量才能扩充这个缺省。
easier商业模式主要应用领域在下列公开场合:
1. 对两个类,挤占的计算天然资源十分多。而且这些天然资源能被自上而下共享资源,则能结构设计为singleton商业模式,强逼自上而下只有两个示例
2. 对两个类,须要对示例展开算数。能在createInstance中展开并能对示例的特征值展开管制。
3. 对两个类,须要对其示例的具体内容犯罪行为展开掌控,比如,期许回到的示例事实上是自己常量的示例。这种能通过Singleton商业模式,对应用程序标识符维持透明化。
Singleton商业模式是两个比较简单的商业模式,上面的标识符就能建立两个Singlton商业模式的范例,这是两个写系统日志的类,前述应用领域的象征意义是在缓存中只留存两个示例,防止开拓数个机能完全相同的辅助工具类示例而消耗计算天然资源。当数个应用领域初始化同两个辅助工具类或掌控类时特别有象征意义,提议项目组合作开发时选用。
public class LogWriter
{
//申明两个静态的变量,类型为类本身
private static LogWriter _instance=null;
//将类的缺省私有化,使得这个类不能被外界建立
private LogWriter()
{
}
//提供静态的方法,建立类的示例
public static LogWriter GetInstance()
{
if (_instance==null)
{
_instance=new LogWriter();
}
return _instance;
}
}
分析:如果是多线程的情况下该如何维持easier商业模式?
A: 多线程时应该也是easier的吧,因为线程之间是共享资源缓存的。
请问要是我想管制示例特征值不超过10个 应该怎么办呢?
A: 做个类似线程池的东西吧
多线程上面也能用,能有很多种方法
1、对静态方法展开同步,2、急切建立示例,3、双重检查加锁
public class Singleton {
private volatile static Singleton singleton ;
private Singleton () {}
public Singleton ( String name ) {}
public static Singleton getInstance () {
if ( singleton==null ) {
synchronized ( Singleton.class ) {
if ( singleton==null ) {
singleton=new Singleton();
}
}
}
return singleton;
}
}
单例商业模式:单例的实现和上面商业模式演变中的最后一种很相似,只要把构造器私有便OK。
简单厂房商业模式
简单厂房商业模式是由两个厂房对象决定建立出哪一种产品类的示例。简单厂房商业模式是厂房商业模式家族中最简单实用的商业模式,能理解为是不同厂房商业模式的两个特殊实现。
public class SteamedBread
{
public SteamedBread() // 构造方法
{ }
private double price=0.5;
public double Price
{
get { return price; }
set { price=value; }
}
}
OK,产品对象建立好了,上面就是建立厂房(Factory)对象了。
public class Factory
{
public static SteamedBread CreateInstance() // 建立两个馒头(SteamedBread)对象
{
return new SteamedBread();
}
}
此时,应用程序能这种来初始化:
public class Client
{
public static void Main(string[] args)
{
//通过厂房建立两个产品的示例
SteamedBread sb=Factory.CreateInstance();
Console.WriteLine("馒头{0}元两个!", sb.Price);
}
}
厂房商业模式
public interface IFruit
{
}
public class Orange:IFruit
{
public Orange()
{
Console.WriteLine("An orange is got!");
}
}
public class Apple:IFruit
{
public Apple()
{
Console.WriteLine("An apple is got!");
}
}
我们的FruitFactory应该是怎么样呢?上面的结构图中它给的是CreateProductA,那好,我就MakeOrange,还有两个CreateProductB,俺MakeOrange还不行??
public class FruitFactory
{
public Orange MakeOrange()
{
return new Orange();
}
public Apple MakeApple()
{
return new Apple();
}
}
怎么使用这个厂房呢?我们来写上面的标识符:
string FruitName=Console.ReadLine();
IFruit MyFruit=null;
FruitFactory MyFruitFactory=new FruitFactory();
switch (FruitName)
{
case "Orange":
MyFruit=MyFruitFactory.MakeOrange();
break;
case "Apple":
MyFruit=MyFruitFactory.MakeApple();
break;
default:
break;
}
抽象化厂房商业模式
示意性标识符如下表所示:
///
/// 食品接口----扮演抽象化产品角色
///
public interface IFood
{
///
/// 每种食品都有销售价格,这里应该作为共性提升到父类或是接口来
/// 由于我们只须要得到价格,所以这里就只提供get属性访问器
///
double price{get;}
}
------------------------------------------------------------------------------------
///
/// 馒头
///
public class SteamedBread:IFood
{
///
/// 构造方法
///
public SteamedBread()
{ }
public double price
{
get
{
return 0.5;
}
}
}
------------------------------------------------------------------------------------
///
/// 包子
///
public class SteamedStuffed:IFood
{
public SteamedStuffed()
{ }
///
/// 销售价格
///
public double price
{
get
{
return 0.6; //0.6元两个
}
}
}
------------------------------------------------------------------------------------
///
/// 厂房角色
///
public class Factory
{
///
/// 建立两个馒头(SteamedBread)对象
///
///
public static IFood CreateInstance(string key)
{
if (key=="馒头")
{
return new SteamedBread();
}
else
{
return new SteamedStuffed();
}
}
}
------------------------------------------------------------------------------------
public class Client
{
public static void Main(string[] args)
{
//通过厂房建立两个产品的示例
IFood food=Factory.CreateInstance("馒头");
Console.WriteLine("馒头{0}元两个!", food.price);
food=Factory.CreateInstance("包子");
Console.WriteLine("包子{0}元两个!", food.price);
}
}
此时的结构设计就已经完全符合简单厂房商业模式的意图了。顾客(Client)对早餐店营业员(Factory)说,我要馒头,于是营业员便根据顾客所提供的数据(馒头),去众多食品中找,找到了然后就拿给顾客。
其他商业模式
转接器商业模式
配器商业模式有两种类的转接器和对象转接器,对象转接器更多一些,对象转接器的优点在很多大侠的著作了已经论述n次了,我这里不多啰嗦,我用的较多的原因还有两个,我从C++转到C,由于C不支持多重继承,我又不比较懒,较少定义interface,因此大多数情况下用C时也只能使用对象转接器商业模式了。只不过转接器和点缀商业模式机能上有很大的相似性,在上面的点缀商业模式中加以论述。
点缀商业模式
也叫油漆工商业模式,点缀商业模式和转接器商业模式相似都是用以利用现成标识符加以调整来满足新的需求,只不过选用结构设计商业模式的目地之一就是复用,这两个商业模式正是复用的体现。当你要用这两种商业模式的时候都是为你现有应用软件新增新的机能,一般情况下,如果你是让你的应用软件新增新的机能操作,你一般要用点缀商业模式,你如果要为应用软件新增机能支持,你最好选择转接器商业模式,你如果想为你的类新增操作你用点缀商业模式,你如果要导入其他来源的现成标识符,你用转接器商业模式。
观测者商业模式
这个商业模式我用的多两个原因就是它能实现事件机能,当然在C中能直接使用事件,但是在C++中却是用能用此商业模式发挥的淋漓尽致了,网上曾经的两个考题(猫大叫一声,主人醒来,耗子跑开),就是使用这个商业模式的最好应用领域。
外形商业模式
合作开发就是能复用的地方就复用,这种才能节省天然资源,提高效率,外形商业模式也是两个提供复用其他现成标识符的应用软件系统,你须要实现两个机能,可能现成的标识符中就有此机能,但是现成标识符可能远远多于你所须要的机能,此时你把这些机能封装起来,再重新提供两个你所须要的接口,这就是这个商业模式的精髓所在。
1.静态成员:
属性,方法和字段是对象示例所特有的,静态成员可看作是类的自上而下对象。 静态属性和字段可访问独立于任何对象示例的数据,静态方法可执行与对象类型相关而与对象示例无关的命令。使用静态成员时,不须要示例化对象。且不能用示例来初始化静态字段,属性,方法。
2.静态类:
只包含静态成员,不能示例化,密封,不须要缺省的定义
发表评论